【发布时间】:2020-12-14 21:31:16
【问题描述】:
我正在研究 Javascript 中的原型设计,并且在一个实验中试图尽可能地去除一些基本对象的信息。但是,我在以下代码段中遇到了问题:
let x = [];
Object.setPrototypeOf(x, null);
console.log(Object.prototype.toString.call(x));
>>> [object Array]
我的困惑是:去掉原型后,Object.prototype.toString 怎么还知道x 是Array 类型?如果不是任何属性,这些信息来自哪里?运行Object.getOwnPropertyNames(x) 和Object.getOwnPropertySymbols(x),我看不到x 上的任何属性,其中包含字符串Array 的任何路径。这些信息存储在哪里?
如果这是那些“内部插槽”之一(虽然我不确定它会是哪个),有没有办法修改它?我至少可以直接访问它吗?
更新:
Yousaf 注意到属性String.toStringTag 通常由Object.prototype.toString 访问,以提供代替上述示例中的“Array”的字符串。实际上,设置x[Symbol.toStringTag] = 'my_string' 允许我们更改.toString() 的值。但是,我认为它仍然没有解开谜团,因为x[Symbol.toStringTag]在我们设置它之前是undefined,不包含所需的“Array”字符串。
【问题讨论】:
-
是的,JS 是通过它们的内部槽或作为一个外来对象(例如数组、函数等 - 它们具有与其属性或原型无关的特殊行为)来区分某些对象类型。您无法修改或访问这些内容。
标签: javascript types prototype prototype-programming