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

最近了解了一下__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相等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值