js> "".__proto__
(new String(""))
js> (new String("")) instanceof String
true
js> "".__proto__ instanceof String
false
答案 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
属性。