那么可以采用(数组,日期,......)并将其更改为其他类型吗?我们以一个数组为例:
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
?
我如何将其更改为其他类型(甚至可能)?
答案 0 :(得分:2)
这是一个理论,因为我不知道console.dir
函数背后的内部wokrings(依赖于浏览器),但我的猜测是console.dir
显示String[2]
而不是Array[2]
,因为internal [[Class]] property是String
。您可以使用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]]内部属性或更改值[[可扩展]]从虚假到真实。
这意味着使用规范中给出的标准语言结构无法做到这一点,尽管可能会或可能不会有一些依赖于实现的扩展使其成为可能。