【问题标题】:Check if instance has inherited function in prototype chain检查实例是否在原型链中继承了函数
【发布时间】:2016-08-10 07:35:15
【问题描述】:

如果我有这样设置的继承方法:

function A() {}


function B() {
    A.call(this,{});
}

B.prototype = Object.create(A);
B.prototype.constructor = B;

function C() {
    B.call(this, {});
}

C.prototype = Object.create(B);
C.prototype.constructor = C;


var a = new A();
var b = new B();
var c = new C();

是否可以确认实例c 的原型链中有A,或者信息是否丢失了?

【问题讨论】:

    标签: javascript prototype instance


    【解决方案1】:

    不!在你的例子中

    C.prototype = Object.create(C);
    C.prototype.constructor = C;
    

    您将C 实例的原型设置为C

    如果你改成C.prototype = Object.create(B);

    你会看到这个

    但这并不意味着您的 c 是 instanceof A。为什么 ? 因为您已将 prototype 设置为 Function 而不是 Object

    如果你将你的代码改成这个,那么它的原型就是一个对象

    function A() {}
    
    
    function B() {
        A.call(this,{});
    }
    
    B.prototype = Object.create(new A());
    B.prototype.constructor = B;
    
    function C() {
        B.call(this, {});
    }
    
    C.prototype = Object.create(new B());
    C.prototype.constructor = C;
    
    
    var a = new A();
    var b = new B();
    var c = new C();
    

    在这种情况下,你的 c 在它的原型链中有 A。

    您可以在控制台中使用c instanceof Bc instanceof A 对其进行测试

    【讨论】:

    • 试试console.log(c instanceof A)
    • @thefourtheye 不要着急
    • 如果AB 接受参数怎么办?你将如何建立原型链?
    • @thefourtheye 参数有什么问题?
    • 抱歉 C.prototype = Object.create(C) 是一个错字。谢谢回复,我试试看!
    猜你喜欢
    • 2019-02-07
    • 2021-09-04
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2020-08-27
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多