1.每一个对象都有一个隐藏属性proto,它指向它的原型对象
2.这个对象会享有原型上的属性或者方法
<script> /* 为什么一个实例化的对象能够使用它原型上的方法 */ function Person(name,age){ this.name=name; this.age=age; } Person.prototype.sayName=function(){ console.log(this.name) } /* 1.每一个对象都有一个隐藏属性__proto__,它指向它的原型对象 2.这个对象会享有原型上的属性或者方法 */ var wang=new Person("wangsiman",18) console.log(wang) //Person{name:"wangsiman",age:18} console.log(wang.__proto__) //{SayName: ƒ, constructor: ƒ} console.log(wang.__proto__==Person.prototype) //true </script>
3.如果一个对象自身没有一个方法,它就会从它的原型上去找
4.bject.prototype是终点,是源头
<script> function Person(name,age){ this.name=name; this.age=age; } Person.prototype.sayName=function(){ console.log(this.name) } var wang=new Person("wangyibo",18); console.log(wang) console.log(wang.__proto__) console.log(wang.__proto__==Person.prototype) //true wang.sayName(wang.toString()) //wangyibon </script>

5.使用extends关键字可以实现继承,之后可以自动拥有父类的属性和方法
<script> /* 面向对象的方法 function Person(name,age){ this.name=name; this.age=age; } Person.prototype.sayName=function(){ this.name; } */ /* es6的方法 */ class Person{ constructor(name,age){ this.name=name; this.age=age; } sayName(){ console.log(this.name) //lisi } } /* 使用extends关键字可以实现继承,之后可以自动拥有父类的属性和方法 */ class Student extends Person{ constructor(name,age,skill){ super(name,age); //super指的是Person this.skill=skill } /* //子类下的函数:这种写法是错误的 saySkill(){ console.log(this.skill) } */ } var huang = new Person("huangzhichao",18); // /* 父类不能使用子类的方法,子类可以使用父类的方法 */ // wang.saySkill() var s=new Student("lisi",17,"html") s.sayName() console.log(s) console.log(s.__proto__)</script>
6.在子类的方法中去调用父类的方法—this
class Person{ constructor(name,age){ this.name=name; this.age=age; } sayName(){ console.log(this.name) } } /* 在子类的方法中去调用父类的方法 */ class Student extends Person{ constructor(name,age,skill){ super(name,age); //super指的是Person this.skill=skill } saySkill(){ this.sayName() } } var huang = new Student("lisi",17,"html") huang.saySkill() var p = new Person("zhangsan",18) console.log(Person.prototype)
