原型链总结:
function Person(){ }
var p1 = new Person();
var o1 = new Object();
1、只有构造函数有原型对象,即只有Person.prototype才有意义,还有诸如内置构造函数Number.prototype 、Boolean.prototype等
2、对象都有__proto__属性,这个属性指向构造函数的原型对象,即
p1.__proto__ === Person.prototype; //p1构造器是Person
o1.__proto__ === Object.prototype; //o1构造器是Object
Person.prototype.__proto__ === Object.prototype; //Person.prototype代表Person的原型对象,原型对象本质还是对象,构造器是Object
Person.__proto__ === Function.prototype; //Person是构造函数对象,构造器是Function
Object.prototype.__proto__ === null; //规定,保证原型链能正常结束
3、原型链只存在于实例对象和其构造函数的原型对象之间,不存在于实例和构造函数之间
Person.prototype.name = 'Lily';
console.log(p1.name); //Lily
console.log(Person.name); //undefined
4、原型链是以__proto__形成,而不是prototype,例
function Car(price){
this.price = price;
}
Car.prototype.type = 'SUV';
var c = new Car(100);
console.log(c.price); //100 因为构造函数中的this代表当前对象,所以构造函数中已经定义实例对象的price属性值等于传入的参数
console.log(c.type); //SUV 由于构造函数中没有定义type属性,所以去检查c.__proto__中是否有type属性,而c.__prototype__ === Car.prototype,一看,有了,c.type === c.__proto__.type === Car.prototype.type;假如c.__proto__依然没有定义type属性,那就继续往上检查c.__proto__.__proto__中是否有,即Car.prototype.__proto__,亦即Object.prototype;继续往上,就到了Object.prototype.__proto__ = null,这就到头了,检查结束 ^-^
网友评论