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

时间:2013-06-14 04:15:45

标签: javascript

出于好奇,并且想要进行一些实验,是否可以在创建对象后更改对象的类型?

通过更改它的类型,我的意思是让对象响应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__属性的存在,我刚刚放弃了它,因为我知道该事件虽然在大多数浏览器中实现但并不是标准的一部分。

3 个答案:

答案 0 :(得分:4)

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

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

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

在此处查看答案:How to set the prototype of a JavaScript object that has already been instantiated?

Here就是我想你要做的一个例子。 它适用于Chrome,Safari,Firefox和node.js。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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