是不是;t一个原型对象一个实例

Isn't a prototype object an instance?

本文关键字:一个 对象 实例 原型 是不是      更新时间:2023-09-26

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

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

这与Learning Array.prototype和计算其长度基本相同。

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

String原型对象本身就是一个String对象(其[[Class]]"String"),其值为空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)使用一些启发式方法来格式化和呈现值。例如,它可以读取对象的CCD_;种类";值,并相应地格式化输出。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属性。