Javascript 原型链更改目标

Javascript Prototype chaining change the target

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

我有一个问题。

    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;

我认为创建和使用新对象一定是有原因的。 但我不知道。 请教我。 谢谢。

至少有一个很好的理由:__proto__ 功能已被弃用,因此您不应该为了将来的兼容性而使用它。

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

有用的补充说明: 使用 b.prototype = Object.create(a.prototype); 是一种以原型方式模拟 Class 继承的方法(b 继承自 a),无需调用 "parent" (a) 构造函数。如果您更愿意通过调用 "parent" 构造函数来模拟继承,则可以使用 b.prototype = new a();

当然它是对class行为的模拟,它在细节上有所不同,因为原型不是class,例如你可以动态地添加函数到a的原型after 创建了一个 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();