我无法理解 javascript 的这种循环行为。
有人能告诉我为什么要这样设计吗? 这种行为有任何实际用例吗?
为什么这个循环? { 新创建的实例从构造函数对象的原型(prototype)属性继承属性。 构造函数的原型(prototype)属性是一个保持构造函数属性的对象。 constructor 属性等于构造函数对象。 构造函数对象再次保留原型(prototype)属性。
instance1---inhertis(keeps)-->func()的原型(prototype)属性-->保持构造函数属性-->函数对象func-->保持原型(prototype)属性
var func = function(){};
var construct = func.prototype.constructor;
console.log(construct === func); //true
var instance1 = new func();
更新:即使在我之间分配了其他东西,instanceof 总是返回 true。
var func1 = function(){};
func1.prototype.constructor = 1;
var instance1 = new func1();
console.log(instance1 instanceof func1); //true
var func2 = function(){};
func2.prototype.constructor = 0;
var instance2 = new func2();
console.log(instance2 instanceof func2); //true
很抱歉在 1 个问题中提出 2 个问题,但这两个问题可能是相关的。
最佳答案
当然它保留了实例。为什么不呢?如果你正在制作一只鸭子,它就是一只鸭子 - 它的 DNA 表明它是一只鸭子,无论你是将它涂成黑色还是教它成为一只鹅。
此外,在您的情况下,设置构造函数无效。当你执行 new func
(或 new func()
,它们是相同的)时,你会去获取函数的内部属性([[Construct]]
属性),然后不是 func.prototype.constructor
。
obj.constructor
是在每个对象上定义的,因为它是在每个“构造函数”上定义的:即 Object Number Function Date Boolean String
等等。每个原型(prototype)都有一个 constructor
属性:
Object.prototype.constructor === Object;
String.prototype.constructor === String;
//etc
每个都有指向自身的prototype.constructor
。
因为函数也可以表现得像构造函数,它们的 .prototype.constructor
属性也指向它们自己。 AFAIK,语言本身未使用它。
简洁的技术性答案? http://es5.github.com/#x11.8.6
//foo instanceof bar
Return the result of calling the [[HasInstance]] internal method of bar with argument foo.
(略有释义)
基本上,您是在问鸭妈妈:“请问女士,这是您的 child 吗?” child 在这件事上几乎没有发言权。
编辑:如评论中所述,更改原型(prototype)确实会影响 instanceof
结果。像上面一样,有直观的答案和技术的答案。
直观的答案很简单:原型(prototype)定义了对象。因此,改变原型(prototype)会改变 DNA - 你让鸭子变成鹅,不是通过教它成为鹅,而是通过找到它的 DNA 并将其变成鹅的 DNA。
技术性是看什么[[HasInstance]]
做。 (other [[HasIntsance]]
称之为这个规范)规范非常枯燥和简洁,所以这里是用伪 javascript 编写的算法:
//assume Func is the function we're talking about
function HasInstance ( value ) {
if ( IsntAnObject(value) ) {
return false;
}
var proto = Func.prototype;
if ( Type(proto) !== "Object" ) {
return false;
}
while ( value !== null ) {
value = value.prototype;
if ( value === proto ) {
return true;
}
}
return false;
}
可以看出,通过更改原型(prototype),我们正在更改行为 - value
将是不同的值。
关于Javascript - 为什么这个循环?实例->(原型(prototype)属性->构造函数属性->函数对象->构造函数属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8285575/