不是原型对象的实例吗?

时间:2013-06-22 14:16:54

标签: javascript

我有一些代码无法理解。
检查下面的smjs代码。我无法理解为什么错误归还 不是原型对象的实例吗?

js> "".__proto__
(new String(""))
js> (new String("")) instanceof String
true
js> "".__proto__ instanceof String
false

1 个答案:

答案 0 :(得分:4)

这与Learning Array.prototype and calculating its length基本相同。

String.prototype 字符串,根据规范§15.5.4, Properties of the String Prototype Object

  

String原型对象本身就是一个String对象(其[[Class]]"String"),其值为空String。

     

String原型对象的[[Prototype]]内部属性的值是标准的内置Object原型对象(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属性。

相关问题