原图地址:?Javascript Object Hierarchy (mollypages.org)?
每个函数function都有一个prototype?
每个函数function都有一个prototype?,这个prototype的属性值是一个对象,默认的只有一个叫做constructor的属性,指向这个函数本身。
function Person() {}
console.log(Person.prototype); // {constructor: ?...}
console.log(Person.prototype.constructor === Person); // true
每个对象都有一个__proto__?
function Person() {}
Person.prototype.name = 'zxx';
Person.prototype.sayName = function() {
console.log(this.name);
}
var person1 = new Person();
person1.sayName(); // zxx
每个对象都有一个隐藏的属性——“__proto__”,这个属性指向创建它的构造函数的原型对象。即:person1.__proto__ === Person.prototype?
__proto__是一个隐藏的属性,不规范,但大多数浏览器都支持了
var obj = {};
obj.__proto__ === Object.getPrototypeOf(obj); // true
看obj.__proto__里面有什么:?
?
?每个对象都有一个__proto__属性,指向创建该对象的函数的prototype,但Object.prototype确实一个特例——它的__proto__指向的是null
Object.prototype.__proto__ === null; // true
原型链
function Person() {}
Person.prototype.name = 'zxx';
Person.prototype.sayName = function() {
console.log(this.name);
}
var person1 = new Person();
person1.sayName(); // zxx
以上代码中,person1是Person函数new出来的对象,person1.sayName方法是怎么来的呢?——从Person.prototype得来,因为person1.__proto__指向的是Person.prototype?
访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。?
参考资料:
深入理解javascript原型和闭包系列 - 王福朋 - 博客园 (cnblogs.com)
|