关于这方面的文章也看了一些。。
今天是做一个总结和记录。
__proto__和prototype
prototype 函数属性
__proto__ 任意对象的属性;(函数也是一个对象)指向自身构造函数的原型对象。
对于下面这个例子,john.__proto__==Person.prototype
Person.prototype(这也是一个对象,它的原型是指的是Object).__proto__==Object.prototype;
理论上Object.prototype这个也是对象,它的.__proto__也应该指向Object.prototype。但是这就形成了一个死循环。
所以定义Object.prototype.__proto__==null;
对象属性方法检索机制:
function Person(){
this.name='1'
this.work=function(){console.log('b')}
}
Person.prototype.work=function(){
console.log('a')
}
Person.prototype.name='2'
john=new Person();
console.log(john.name)//输出1
console.log(john.work)//输出b
function Person(){
}
Person.prototype.work=function(){
console.log('a')
}
Person.prototype.name='2'
john=new Person();
console.log(john.name)//输出2
console.log(john.work)//输出a
对于john来说,它是构造函数Person的实例对象,因为使用了new操作符,所以,Person中的this指向了john。work和name指向了john,
1. 我们查找john的work方法,先查找它自身,(这个例子中自身有work方法);
2. 如果没有的话,通过原型链去查找构造函数的原型对象。(删掉this.work,程序会输出a)
3. 如果构造函数的原型对象中也没有,就查找Object的原型对象。。Object没有,则会输出undefined。