面试中的重要问题,我遇到过的面试问题中,原型链被问到的几率特别大,所以整理一个笔记记录下来我对原型链的理解。
每个构造函数(constructor)都有一个原型对象(prototype),原型对象都包含一个指向构造函数的指针,每个指针形成的环绕,就是一个原型链
创造一个构造函数
constructor 属性
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHello = function() { console.log(this.name,"hello") }
}
var person1 = new Person('小明', 28);
var person2 = new Person('小刚', 23);
上面的例子中 person1 和 person2 都是 Person 的实例,这两个实例都有一个 constructor (构造函数)属性,该属性(是一个指针)指向 Person。
实例的构造函数属性(constructor)指向构造函数
person1.constructor == Person
person2.constructor == Person
prototype 属性
在 JavaScript中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype属性,这个属性指向函数的原型对象。
每个对象都有 proto 属性,但只有函数对象才有 prototype 属性
Person的原型对象就是 Person.prototype
proto 属性
JS 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__ 的内置属性,用于指向创建它的构造函数的原型对象。
person1.__proto__ === Person.prototype
总结:
Person.prototype.constructor == Person;
person1.__proto__ == Person.prototype;
person1.constructor == Person;