Javascript原型链更改目标

问题描述 投票:0回答:1

我是一名学习编程的学生。

我有一个问题。

    function a () {

    }

    a.prototype.prtSomething = function(arg) { console.log(arg); }

    function b () {

    }

    var myObj = new b();

如果我想在myObj中使用a的方法,我们将使用此代码。

b.prototype = Object.create(a.prototype);
b.prototype.constructor = b;

这意味着更改作用域链接的目标。但是为什么不使用此代码?

b.prototype.__proto__ = a.prototype;

我认为必须有创建和使用新对象的理由。但我不知道请教我。谢谢。

javascript prototype prototype-chain
1个回答
0
投票

至少出于一个很好的理由:__proto__功能已被弃用,因此您不应将其用于将来的兼容性。

我建议阅读MDN page on the topic,如果正在学习,还建议链接有关继承的页面。

有用的附加说明:使用b.prototype = Object.create(a.prototype);是一种以原型方式模拟类继承(b从a继承)而无需调用“父”(a)构造函数的方法。如果您希望通过调用“父”构造函数来模拟继承,则可以使用b.prototype = new a();

当然,这是对类行为的模仿,在细节上有所不同,因为原型不是类,例如,您可以向a的原型动态添加功能之后已经创建了b的实例,并且新功能将对实例可用,因为它通过引用起作用。以类似的方式,第二个示例不会为每个其他实例执行a的构造函数,而是在将其分配给b的原型时仅执行一次。

实际上,当您了解原型时,它们会非常强大,可以进行很多组合。

function a () {
    console.log('a constructor');
}

a.prototype.prtSomething = function(arg) { console.log(arg); }

function b () {
    console.log('b constructor');
}

b.prototype = Object.create(a.prototype);
b.prototype.constructor = b;

var myObj = new b();

function a () {
    console.log('a constructor');
}

a.prototype.prtSomething = function(arg) { console.log(arg); }

function b () {
    console.log('b constructor');
}

b.prototype = new a();
b.prototype.constructor = b;

var myObj = new b();
© www.soinside.com 2019 - 2024. All rights reserved.