JsWeb前端之路让前端飞

前端面试题——prototype 与 __proto__

2017-06-10  本文已影响130人  ac68882199a1

当我们声明一个构造器函数,并为其添加原型链方法的时候,我们会这样做:

function Super () {
    ...
}

Super.prototype.func = function () {
    ...
}

new 一个继承自super的对象sub并将其打印,会发现sub上并没有prototype,取而代之的是__proto__,同时原型链上的func方法也被挂载在了__proto__属性上

那么构造器中的prototype到哪里去了呢?这个莫名其妙就窃取了func__proto__又是什么呢?

通过 proto 实现的“继承”

随意打印一个对象,会发现它们都有__proto__属性,而__proto__中也有__proto__,一级一级追溯,会发现最终的__proto__都是Object

其实,在 js 中并没有真正意义上的继承关系,通过new实现的继承可以通过call方式来实现

var sub1 = {}
sub1.__proto = Super.prototype
Super.call(sub1)

call方式是将sub1__proto__指向了Superprototype,再改变执行环境,从而实现继承。那new的对象的__proto__是不是也等于Superprototype呢?

var sub2 = new Super()
sub2.__proto__ === Super.prototype // true

当调用一个方法时,会先查询这个对象本身的属性,如果没有这个方法,再到它的__proto__上查找,如果依然没有,就到__proto____proto__上查找,这样一级一级往上也就形成了原型链

综上所述(可能有点乱),对象的继承本质上通过__proto__实现,而prototype在整个原型链的实现中只是起到了一个辅助的作用

扫码关注前端周记公众号
上一篇下一篇

猜你喜欢

热点阅读