首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原型对象不是实例吗?

原型对象不是实例吗?
EN

Stack Overflow用户
提问于 2013-06-22 22:16:54
回答 1查看 92关注 0票数 1

我有一些代码不能理解。

已在smjs上检查以下代码。我不明白为什么false会返回。

原型对象不是实例吗?

代码语言:javascript
复制
js> "".__proto__
(new String(""))
js> (new String("")) instanceof String
true
js> "".__proto__ instanceof String
false
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-22 23:01:22

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

根据规范,String.prototype is a string,§15.5.4, Properties of the String Prototype Object

String原型对象本身就是一个

对象(其[[Class]]"String"),其值为空字符串。

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

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

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

代码语言:javascript
复制
Object.getPrototypeOf(String.prototype) === String.prototype

因此,您正在测试String.prototype是否是它自己的原型,当然也就是false。正如规范中提到的,String.prototype的原型是Object.prototype

关于第一个示例的一句话:

代码语言:javascript
复制
> js> "".__proto__
 (new String(""))

您必须记住,控制台(或RELP)使用一些启发式方法来格式化和表示值。例如,它可能会读取对象的constructor属性来确定它是什么“种类”的值,并相应地格式化输出。这就是Chrome控制台正在做的事情:

代码语言:javascript
复制
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属性,该属性指向它是原型对象的函数,即

代码语言:javascript
复制
function Foo() {}
Foo.prototype.constructor === Foo;
=> true
console.dir(Foo.prototype)
=> Foo

因此,如果您记录一个原型对象,输出可能表明该对象是函数本身的一个实例,尽管它不是,只是因为constructor属性。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17251694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档