我有一些代码无法理解。
在 smjs 上检查了下面的代码。我不明白为什么 false 返回。
原型对象不是实例吗?
js> "".__proto__
(new String(""))
js> (new String("")) instanceof String
true
js> "".__proto__ instanceof String
false
我有一些代码无法理解。
在 smjs 上检查了下面的代码。我不明白为什么 false 返回。
原型对象不是实例吗?
js> "".__proto__
(new String(""))
js> (new String("")) instanceof String
true
js> "".__proto__ instanceof String
false
这与学习 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
属性。