我有一些代码不能理解。
已在smjs上检查以下代码。我不明白为什么false会返回。
原型对象不是实例吗?
js> "".__proto__
(new String(""))
js> (new String("")) instanceof String
true
js> "".__proto__ instanceof String
false发布于 2013-06-22 23:01:22
这基本上与Learning Array.prototype and calculating its length相同。
根据规范,String.prototype is a string,§15.5.4, Properties of the String Prototype Object
String原型对象本身就是一个
对象(其
[[Class]]为"String"),其值为空字符串。
字符串原型对象的[[Prototype]]内部属性的值是标准的内置对象原型对象(15.2.4)。
但它不是构造函数String的实例。
instanceof的工作原理是将实例的原型与构造函数(§15.3.5.3)的prototype属性进行比较,即
Object.getPrototypeOf(String.prototype) === String.prototype因此,您正在测试String.prototype是否是它自己的原型,当然也就是false。正如规范中提到的,String.prototype的原型是Object.prototype。
关于第一个示例的一句话:
> js> "".__proto__
(new String(""))您必须记住,控制台(或RELP)使用一些启发式方法来格式化和表示值。例如,它可能会读取对象的constructor属性来确定它是什么“种类”的值,并相应地格式化输出。这就是Chrome控制台正在做的事情:
var str = new String('foo');
str instanceof String
=> true
console.dir(str);
=> String
var obj = {};
console.dir(obj);
=> Object // looks good
obj.constructor = String;
=> console.dir(obj);
String // uhm what?
obj instanceof String
=> false碰巧每个原型对象都有一个constructor属性,该属性指向它是原型对象的函数,即
function Foo() {}
Foo.prototype.constructor === Foo;
=> true
console.dir(Foo.prototype)
=> Foo因此,如果您记录一个原型对象,输出可能表明该对象是函数本身的一个实例,尽管它不是,只是因为constructor属性。
https://stackoverflow.com/questions/17251694
复制相似问题