美文网首页JsWeb前端之路让前端飞
前端面试题——prototype 与 __proto__

前端面试题——prototype 与 __proto__

作者: ac68882199a1 | 来源:发表于2017-06-10 23:19 被阅读130次

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

    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在整个原型链的实现中只是起到了一个辅助的作用

    扫码关注前端周记公众号

    相关文章

      网友评论

        本文标题:前端面试题——prototype 与 __proto__

        本文链接:https://www.haomeiwen.com/subject/utwcqxtx.html