1

我有一些代码无法理解。
在 smjs 上检查了下面的代码。我不明白为什么 false 返回。
原型对象不是实例吗?

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

1 回答 1

4

这与学习 Array.prototype 并计算其长度基本相同。

String.prototype 一个字符串,根据规范,§15.5.4,字符串原型对象的属性

String 原型对象本身就是一个 String 对象(它的[[Class]]is "String"),其值为空字符串。

String 原型对象的内部属性的值[[Prototype]]是标准的内置 Object 原型对象(15.2.4)。

但它不是构造函数的实例String

instanceof通过将实例的原型与prototype构造函数的属性(§15.3.5.3)进行比较来工作,即

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属性。

于 2013-06-22T15:01:21.603 回答