原型
指由同一个构造函数实例化的对象的一个公共的祖先,叫做原型。所有实例化的对象继承同一个原型的属性和方法。
通过prototype构造原型:
function Person(name,age){
this.name=name;
this.age=age;
Person.prototype.weight="20kg";
}
var Bob=new Person(Bob,20);
var Tom=new Person(Tom,30);
console.log(Bob.weight); //20kg
console.log(Tom.weight); //20kg
__proto__:
__proto__相当于一个指针,指向构造函数的prototype属性:
console.log(Bob.__proto__==Person.prototype); //true
原型也时对象,原型对象的__proto__指向Object.prototype:
console.log(Person.prototype.__proto__==Object.prototype); //true
Object的__proto__指向null:
console.log(Object.prototype.__proto__ == null) //true
对__proto__的理解:
__proto__相当于一个指针,当构造函数实例化对象的时候,实例化的对象的__proto__就会指向同一个原型对象的属性和方法,而不是复制一个相同的属性和方法。
所以在实例化对象的时候,并没有为原型内的属性和方法开辟新的内存空间,而是只是改变指针的指向,从而减少了内存的占用。
constructor:
constructor是构造函数prototype中的一个属性,指向当前构造函数,所以当构造函数实例化对象的时候,constructor的值继承自同一个原型,都指向构造函数。
console.log(Bob.constructor===Person); //true
构造函数中的prototype的constructor属性指向自己:
console.log(Person.prototype.constructor===Person); //true
获取一个实例对象的属性时,先在实例对象内部寻找,如果没有再在原型中寻找:
function Person(name,age){
this.name=name;
this.age=age;
Person.prototype.age="18"
}
var Bob=new Person(Bob,20); //20
原型的指向可以改变:
function Person(){
Person.prototype.weight="50kg";
}
function People(){
People.prototype.height="180cm";
}
Person.prototype=new People();
var Jack=new Person();
console.log(Jack.__proto__); //指向People
console.log(Jack.weight); //50kg
原型链:
网上找的一张图:
外链:https://slartbartfast.cn/articlePage.php?articleid=238