gpt4 book ai didi

javascript - 原型(prototype)对象不是实例吗?

转载 作者:行者123 更新时间:2023-11-30 10:30:17 24 4
gpt4 key购买 nike

我有一些代码看不懂。
在 smjs 上检查了下面的代码。我不明白为什么返回 false。
原型(prototype)对象不是实例吗?

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

最佳答案

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

String.prototype 一个字符串,根据规范,§15.5.4, Properties of the String Prototype Object :

The String prototype object is itself a String object (its [[Class]] is "String") whose value is an empty String.

The value of the [[Prototype]] internal property of the String prototype object is the standard built-in Object prototype object (15.2.4).

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

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

Object.getPrototypeOf(String.prototype) === String.prototype

因此,您正在测试 String.prototype 是否是它的 own 原型(prototype),这当然是 false。如规范中所述,String.prototype 的原型(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

碰巧每个原型(prototype)对象都有一个constructor属性,它指向它作为原型(prototype)对象的函数,即

function Foo() {}
Foo.prototype.constructor === Foo;
=> true
console.dir(Foo.prototype)
=> Foo

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

关于javascript - 原型(prototype)对象不是实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17251694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com