最近了解了一下__proto__与prototype: prototype : 1.简单的说它就是一个属性且属性的值为地址,指向一个对象。 而它通常为函数的属性。 2.它主要用来共享属性和方法(常用于构造函数创
最近了解了一下__proto__与prototype:
prototype:
1.简单的说它就是一个属性且属性的值为地址,指向一个对象。
而它通常为函数的属性。
2.它主要用来共享属性和方法(常用于构造函数创建实例对象给实例对象共享属性)
3.主要用来被访问
4.判断自有属性和原型属性 一般用hasOwnProperty()
function Person(name){ this.name = name; } typeof(Person.prototype) //'object' Person.prototype.publicData = 'test' Person.privateData = 'test1' Person.hasOwnProperty("privateData") //true Person.hasOwnProperty("publicData") //false var bob = new Person('bob') var mary = new Person('mary') //bob和mary共享publicData属性
__proto__:
1.基本所有的对象有该属性
2.用来构建原型链访问构造方法中的显示原型
如何访问?
var arr = new Array() arr.__proto__ === Array.prototype //true arr.push(1) arr.hasOwnProperty("push")//false 'push' in arr//true
以上代码:Array是arr的构造函数,arr的隐式原型指向Array的显示原型,arr中并无push的方法,却能调用到push这个方法
这里的push方法调用的是Array.prototype中的方法
理论上原型链可以无限长
function Foo(){} function Bar(){} Foo.prototype = new Bar()
此时Foo继承了Bar: Foo的实例在访问原型链的时候先访问Foo的显示原型在访问Bar的显示原型
Foo.prototype = {}
当然我们可以手动修改Foo的继承,以上两种方法重写了Foo.prototype,所以Foo.prototype.constructor也跟着改变了。
那Foo.__proto__指向谁呢? 构造函数是Function的实例 所以Foo.__proto__ === Function.prototype
instanceof的判断:
function Foo(){} Foo instanceof Function Foo.__proto__.__proto__ ..... === Function.prototype?
Foo沿着原型链不断的向上查找 分别判断是否与Function.prototype相等