Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中构造函数指针行为背后的基本原理是什么?_Javascript_Oop - Fatal编程技术网

JavaScript中构造函数指针行为背后的基本原理是什么?

JavaScript中构造函数指针行为背后的基本原理是什么?,javascript,oop,Javascript,Oop,考虑到过于简单的情况: function Base() {} function Child() {} Child.prototype = new Base; 函数基(){} 函数Child(){} Child.prototype=新基础; 我想知道为什么Child实例的构造函数属性设置为Base而不是Child?这都与JavaScript中继承的工作方式有关。检查详细的解释(基本上,构造函数只是原型的另一个属性) 编辑:此外,如果您想要“真实”原型继承,您必须使用某种克隆功能,例如 functi

考虑到过于简单的情况:

function Base() {} function Child() {} Child.prototype = new Base; 函数基(){} 函数Child(){} Child.prototype=新基础;
我想知道为什么Child实例的构造函数属性设置为Base而不是Child?

这都与JavaScript中继承的工作方式有关。检查详细的解释(基本上,
构造函数
只是原型的另一个属性)

编辑:此外,如果您想要“真实”原型继承,您必须使用某种克隆功能,例如

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的属性,而不是构造函数中设置的属性。

这一切都与JavaScript中的继承工作方式有关。检查详细的解释(基本上,
构造函数
只是原型的另一个属性)

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
编辑:此外,如果您想要“真实”原型继承,您必须使用某种克隆功能,例如

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
基本上,原型的任何属性都成为实例的属性,包括“构造函数”

当您将整个prototype属性重新分配给新对象时,您将用新的构造函数属性替换旧的构造函数属性

如果不希望发生这种情况,则必须逐个为prototype对象指定属性,而不是一次性将整个prototype属性指定给新对象。或者在以后替换旧的构造函数属性

更好的主意是:任何重要的事情都不要依赖构造函数属性

基本上,原型的任何属性都成为实例的属性,包括“构造函数”

当您将整个prototype属性重新分配给新对象时,您将用新的构造函数属性替换旧的构造函数属性

如果不希望发生这种情况,则必须逐个为prototype对象指定属性,而不是一次性将整个prototype属性指定给新对象。或者在以后替换旧的构造函数属性


更好的主意是:不要依赖构造函数属性做任何重要的事情。

instanceof
如果您知道自己在做什么,那么使用它是完全安全的:
obj instanceof Func
Func.prototype.isPrototypeOf(obj)
;它所做的只是检查[[Prototype]]链中的特定对象——这在具有原型继承性的语言中是完全合理的。我认为您的建议是不要依赖instanceof的使用。它可以完美地工作,并且完全按照它应该做的做。+1关于“不依赖构造函数属性”,它不是标准的/全局可用的,并且不能按照它看起来的方式工作。更多:更糟的是,我在我的回答中有“instanceof”的评论大约2分钟,我自己意识到我太过火了,并把它删掉了。现在我第二天回来,发现有评论说我做得太过分了?真奇怪,stackoverflow有什么问题吗?编辑未生效?
instanceof
如果您知道自己在做什么,则可以完全安全地使用:
obj instanceof Func
Func.prototype.isPrototypeOf(obj)
相同;它所做的只是检查[[Prototype]]链中的特定对象——这在具有原型继承性的语言中是完全合理的。我认为您的建议是不要依赖instanceof的使用。它可以完美地工作,并且完全按照它应该做的做。+1关于“不依赖构造函数属性”,它不是标准的/全局可用的,并且不能按照它看起来的方式工作。更多:更糟的是,我在我的回答中有“instanceof”的评论大约2分钟,我自己意识到我太过火了,并把它删掉了。现在我第二天回来,发现有评论说我做得太过分了?真奇怪,stackoverflow有什么问题吗?编辑不生效?