当前位置 : 主页 > 大数据 > 区块链 >

__proto__(隐式原型)与prototype(显式原型)

来源:互联网 收集:自由互联 发布时间:2021-06-22
最近了解了一下__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相等

网友评论