假设我的JavaScript代码中有一个对象foo
。foo
是一个复杂的对象,它是在其他地方生成的。如何更改foo
对象的原型?
我的动机是为从.NET序列化为JavaScript文字的对象设置适当的原型。
假设我在ASP.NET页面中编写了以下JavaScript代码。
var foo = <%=MyData %>;
假设MyData
是在Dictionary<string,string>
对象上调用.NET JavaScriptSerializer
的结果。
在运行时,这将变为以下内容:
var foo = [{"A":"1","B":"2"},{"X":"7","Y":"8"}];
如您所见,foo
变成了一个对象数组。我希望能够用一个合适的原型初始化foo
。我既不想修改Object.prototype
也不想修改Array.prototype
。我该怎么做呢?
发布于 2015-05-06 14:18:42
ES6最后指定了Object.setPrototypeOf(object, prototype),它已经在Chrome和Firefox中实现了。
发布于 2011-08-23 10:48:58
可以在对象的实例上使用constructor
在位更改对象的原型。我相信这就是你所要求的。
这意味着如果您有作为Foo
实例的foo
function Foo() {}
var foo = new Foo();
通过执行以下操作,可以将属性bar
添加到Foo
的所有实例:
foo.constructor.prototype.bar = "bar";
这是一个展示概念验证的小提琴:http://jsfiddle.net/C2cpw/。我不太确定老的浏览器如何使用这种方法,但我很确定这应该可以很好地完成这项工作。
如果您的意图是将功能混合到对象中,则此代码片段应该可以完成此任务:
function mix() {
var mixins = arguments,
i = 0, len = mixins.length;
return {
into: function (target) {
var mixin, key;
if (target == null) {
throw new TypeError("Cannot mix into null or undefined values.");
}
for (; i < len; i += 1) {
mixin = mixins[i];
for (key in mixin) {
target[key] = mixin[key];
}
// Take care of IE clobbering `toString` and `valueOf`
if (mixin && mixin.toString !== Object.prototype.toString) {
target.toString = mixin.toString;
} else if (mixin && mixin.valueOf !== Object.prototype.valueOf) {
target.valueOf = mixin.valueOf;
}
}
return target;
}
};
};
发布于 2011-08-11 02:33:47
你可以做火狐,Chrome和Safari支持的foo.__proto__ = FooClass.prototype
,AFAIK。请记住,__proto__
属性是非标准的,可能会在某一时刻消失。
文档:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/proto。另请参阅http://www.mail-archive.com/jsmentors@googlegroups.com/msg00392.html,了解为什么没有Object.setPrototypeOf()
以及为什么不推荐使用__proto__
。
https://stackoverflow.com/questions/7015693
复制相似问题