[英]What is the rationale for the behavior of the 'this' keyword in JavaScript?
[英]What is the rationale behind the behavior of constructor pointer in JavaScript?
考虑简单的情况:
function Base() {} function Child() {} Child.prototype = new Base;
我想知道为什么Child实例将构造函数属性设置为Base而不是Child?
这与继承在JavaScript中的工作方式息息相关。 检查此链接以获取详细说明(基本上, constructor
只是原型的另一个属性)。
编辑:此外,如果您想要“真实的”原型继承,则必须使用某种克隆功能,例如
function clone(obj) {
if(typeof obj !== 'undefined') {
arguments.callee.prototype = Object(obj);
return new arguments.callee;
}
}
然后,你可以做这样的事情
function Base() {}
function Sub() {}
Sub.prototype = clone(Base.prototype);
var obj = new Sub;
而且您仍然会true
两次
document.writeln(obj instanceof Sub);
document.writeln(obj instanceof Base);
解决方案的不同之处在于,不会调用Base()
并且Sub.prototype
将仅继承Base.prototype
的属性-而不继承构造函数中设置的属性。
function Base() {}
//Base.prototype.constructor === Base
function Child() {}
//Child.prototype.constructor === Child;
var b = new Base;
//b.constructor = Base;
Child.prototype = b;
//Child.prototype.constructor === Base
基本上,原型的任何属性都将成为实例的属性,包括“构造函数”
当您将整个原型属性重新分配给一个新对象时,您将用新的原型属性替换旧的构造函数。
如果您不希望发生这种情况,则必须将属性一一分配给原型对象,而不是一次将整个原型属性分配给一个新对象。 或随后替换旧的构造函数属性。
更好的主意是:不要依赖任何重要的构造函数属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.