首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何设置已经实例化的JavaScript对象的原型?

如何设置已经实例化的JavaScript对象的原型?
EN

Stack Overflow用户
提问于 2011-08-11 02:15:16
回答 7查看 82K关注 0票数 110

假设我的JavaScript代码中有一个对象foofoo是一个复杂的对象,它是在其他地方生成的。如何更改foo对象的原型?

我的动机是为从.NET序列化为JavaScript文字的对象设置适当的原型。

假设我在ASP.NET页面中编写了以下JavaScript代码。

代码语言:javascript
复制
var foo = <%=MyData %>;

假设MyData是在Dictionary<string,string>对象上调用.NET JavaScriptSerializer的结果。

在运行时,这将变为以下内容:

代码语言:javascript
复制
var foo = [{"A":"1","B":"2"},{"X":"7","Y":"8"}];

如您所见,foo变成了一个对象数组。我希望能够用一个合适的原型初始化foo。我既不想修改Object.prototype也不想修改Array.prototype。我该怎么做呢?

EN

回答 7

Stack Overflow用户

发布于 2015-05-06 14:18:42

ES6最后指定了Object.setPrototypeOf(object, prototype),它已经在Chrome和Firefox中实现了。

票数 36
EN

Stack Overflow用户

发布于 2011-08-23 10:48:58

可以在对象的实例上使用constructor在位更改对象的原型。我相信这就是你所要求的。

这意味着如果您有作为Foo实例的foo

代码语言:javascript
复制
function Foo() {}

var foo = new Foo();

通过执行以下操作,可以将属性bar添加到Foo的所有实例:

代码语言:javascript
复制
foo.constructor.prototype.bar = "bar";

这是一个展示概念验证的小提琴:http://jsfiddle.net/C2cpw/。我不太确定老的浏览器如何使用这种方法,但我很确定这应该可以很好地完成这项工作。

如果您的意图是将功能混合到对象中,则此代码片段应该可以完成此任务:

代码语言:javascript
复制
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;
    }
  };
};
票数 14
EN

Stack Overflow用户

发布于 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__

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7015693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档