创建对象后更改对象的类型

Change the type of an object after it has been created

本文关键字:类型 对象 创建对象      更新时间:2023-09-26

只是出于好奇,并做一个小实验,我有一个想法,是有可能改变一个对象的类型后,它被创建?

通过改变它的类型,我的意思是使对象响应instanceof操作符,像这样:

(正如你所看到的,我试图改变构造函数,但它不起作用)

var MyConstructor = function() { this.name = 'no name' };
undefined
var myInstance = { name: 'some name' }
undefined
myInstance instanceof Object
true
myInstance instanceof MyConstructor
false
myInstance.constructor
function Object() { [native code] }
myInstance.constructor = MyConstructor
function () { this.name = 'no name' }
myInstance instanceof Object
true
myInstance instanceof MyConstructor
false

我想我可以用新的MyConstructor()创建一个新对象,然后删除它的每个属性,然后从myInstance复制每个属性,但想知道是否存在更简单的方法…

——

我确实知道__proto__属性的存在,我只是把它丢弃了,因为我知道事件虽然它在大多数浏览器中实现,但不是标准的一部分。

由于JavaScript是一种原型基语言,instanceof方法检查对象的__proto__属性。

所以我猜你的问题是我可以改变创建对象的原型吗?

在某些情况下可以,但这是一个坏主意。

检查这里的答案:如何设置一个JavaScript对象的原型,已经被实例化?

这是一个我猜你正在尝试做的例子。它适用于Chrome, Safari, Firefox和node.js。

myInstance.__proto__ = new MyConstructor()
myInstance instanceof MyConstructor
true

然而,这是不标准的,不是一个好主意https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof

在一些浏览器中,对象的原型是通过__proto__属性暴露的,但使用它是不明智的——它不能依赖,也不是官方规范的一部分。

因此,你基本上应该接受这样一个事实:你不能在对象创建后改变它的类型,或者打乱它的原型链。