0

只是出于好奇,为了做一个我想做的小实验,是否可以在创建对象后更改它的类型?

通过更改它的类型,我的意思是让对象响应 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

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

- 更新 -

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

4

3 回答 3

4

由于 JavaScript 是原型基础语言,因此该instanceof方法是检查对象的__proto__属性。

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

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

在这里查看答案:如何设置已经实例化的 JavaScript 对象的原型?

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

于 2013-06-14T04:30:49.503 回答
1
myInstance.__proto__ = new MyConstructor()
myInstance instanceof MyConstructor
true

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

于 2013-06-14T04:29:13.720 回答
1

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

因此,您基本上应该接受在创建对象后无法更改其类型,或者弄乱其原型链。

于 2013-06-14T04:29:24.327 回答