我无法理解javascript的这种循环行为.
有人可以告诉我它为什么以这种方式设计?这种行为有没有真正的用例?
为什么这个循环?{新创建的实例从构造函数对象的prototype属性继承属性.构造函数的prototype属性是一个保持构造函数属性的对象.构造函数属性等于构造函数对象.构造函数对象再次保留原型属性.}
instance1 --- inhertis(保持) - > func()的原型属性 - >保持构造函数属性 - >函数对象func - >保持原型属性.
var func = function(){};
var construct = func.prototype.constructor;
console.log(construct === func); //true
var instance1 = new func();
Run Code Online (Sandbox Code Playgroud)
更新:即使在我指定的其他内容之间,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
Run Code Online (Sandbox Code Playgroud)
很抱歉在1中提出2个问题,但两者可能都有关系.
当然它保留了实例.为什么不呢?如果你正在制作一只鸭子,它就是一只鸭子 - 它的DNA就说它是一只鸭子,无论你把它画成黑色还是教它成为一只鹅.
此外,在您的情况下,设置构造函数无效.当你做new func(或者new func(),它们是相同的)时,你去抓住函数([[Construct]]属性)的内部属性,而不是func.prototype.constructor.
obj.constructor在每个单独的对象上定义,因为它是在每个"构造函数"上定义的:即,Object Number Function Date Boolean String依此类推.每个人的constructor原型都有一个属性:
Object.prototype.constructor === Object;
String.prototype.constructor === String;
//etc
Run Code Online (Sandbox Code Playgroud)
每个人都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.
Run Code Online (Sandbox Code Playgroud)
(稍微转述)
基本上,你问的是母鸭:"对不起,女士,这是你的孩子吗?" 孩子在这件事上几乎没有发言权.
编辑:如评论中所述,更改原型确实会影响instanceof结果.如上所述,有直观的答案和技术答案.
直观的答案很简单:原型定义了对象.因此,改变原型可以改变DNA - 你可以将鸭子变成鹅,而不是将它教成鹅,而是通过转向DNA并将其变成鹅DNA.
技术性正在看什么[[HasInstance]].(另一个[[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;
}
Run Code Online (Sandbox Code Playgroud)
可以看出,通过改变原型,我们改变了行为 - value将是不同的值.