我是一名学习编程的学生。
我有一个问题。
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);
是一种以原型方式模拟类继承(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();