是否可以更改标准JavaScript对象的类型

时间:2015-05-25 00:06:18

标签: javascript

那么可以采用(数组,日期,......)并将其更改为其他类型吗?我们以一个数组为例:

var arr = [];
arr.__proto__ = NodeList.prototype;
arr instanceof Array // is now false

但如果我这样做: dir(arr); // Array[0]

所以它在技术上仍然是Array而不是实例?

如何将其更改为其他类型。

另一个例子:

var str = new String('hi'); // I used new String to return mutable object
var str.__proto__ = Array.protoype;
dir(str); // String[2]

技术上仍然是String

我如何将其更改为其他类型(甚至可能)?

1 个答案:

答案 0 :(得分:2)

这是一个理论,因为我不知道console.dir函数背后的内部wokrings(依赖于浏​​览器),但我的猜测是console.dir显示String[2]而不是Array[2],因为internal [[Class]] propertyString。您可以使用Object.prototype.toString function

对其进行测试
var x = new String("hi");
x.__proto__ = Array.prototype;
x instanceof Array // true
Object.prototype.toString.call(x) // "[object String]"

根据{{3>回答您关于是否可以更改JavaScript对象类型(即在此问题的上下文中,内部[[Class]]属性)的问题}}:

  

注意此规范不定义ECMAScript语言运算符或内置函数,允许程序修改对象的[[Class]]或[[Prototype]]内部属性或更改值[[可扩展]]从虚假到真实。

这意味着使用规范中给出的标准语言结构无法做到这一点,尽管可能会或可能不会有一些依赖于实现的扩展使其成为可能。