【问题标题】:Constructor taking object without duplicating the object构造函数获取对象而不复制对象
【发布时间】:2015-10-14 22:41:24
【问题描述】:

我想将一个普通的 JavaScript 对象变成一个带有原型等的对象,而不是克隆对象。这可能吗?

基本上,而不是这样:

var MyClass = function(fromObj) {
  this.propA = fromObj.propA;
  this.propB = fromObj.propB;
  ...
}
inherit (SuperClass, MyClass);

我想:

var MyClass = function(fromObj) {
  this = fromObj;
}
inherit (SuperClass, MyClass);

要特别清楚:我希望从构造函数返回的对象与传入的对象相同(不是重复的,不是克隆的)。

有没有办法做到这一点?或者更好的方式来描述我的要求? :)

我喜欢这个有两个原因:

  1. 我们正在加载大量对象,速度和内存可能开始变得重要。
  2. 有很多地方使用了“普通的旧 javascript 对象”,可能很难确保它们都指向新的实例化对象。

【问题讨论】:

  • “不重复”是什么意思?执行函数后您是否希望影响其他对象?克隆用于描述一个新的实例。
  • 通过引用传递对象? stackoverflow.com/questions/13104494/…
  • 澄清,@PHPglue - 没有重复。我确实希望它影响另一个(嗯,相同的)对象。
  • 你可以只做一个variable = Object,然后variable.property =会影响Object。 var whatever = new ConstructorHere(), again = whatever;
  • 因此实际上您只想将传入对象的内部[[Prototype]] 属性分配给构造函数原型的属性,实际上与Object.create(prototypeObject) 相反。见Object.setPrototypeOf。另请参阅 MDN 和有关性能的警告。

标签: javascript object prototype prototypal-inheritance


【解决方案1】:

我猜您想这样做,以便 JSON.parse 创建的对象是 Object 以外的其他对象的实例。

一种选择是使用Object.setPrototypeOf从指定的构造函数分配一个新的[[Prototype]],但是有performance warnings for this on MDN(我不知道声明的有效性)。

更有效的解决方案可能是创建“包装”对象并将 JSON 创建的对象附加为属性。这种方法被许多 DOM 库使用,并避免了 JSON 数据中的属性名称与对象的方法名称冲突的可能性(例如,DOM 库可以使用与 DOM 方法具有相同名称和特征的方法,但不要覆盖或与它们冲突)。

数据可以保存在一个闭包中,这样只有构造函数定义的 getter 和 setter 才能访问它。

【讨论】:

    猜你喜欢
    • 2012-11-24
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多