最近了解了一下__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相等
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。