Ember.js:通过原型和元动态地改变Ember对象的“类”

时间:2013-11-05 13:33:43

标签: javascript ember.js metaprogramming prototype

我想知道是否可以更改现有对象实例的'class'(派生自Ember.Object.extend),例如计算属性,Ember的_super /继承/ mixins,绑定,观察者,Ember对象模型的所有其他好处仍然有用。

我尝试过简单地将__proto__设置为不同的类prototype,但这对于计算属性失败(它会查找旧类的计算属性):

Triangle = Ember.Object.extend
  sides: 3
  greeting: (->
    "I'm a triangle and I have #{sides} sides"
  ).property('sides')

Square = Ember.Object.extend
  sides: 4
  greeting: (->
    "I'm a square and I have #{sides} sides"
  ).property('sides')

t = Triangle.create()
t.get('greeting') # I'm a triangle and I have 3 sides
t.__proto__ = Square.prototype
t.get('greeting') # I'm a triangle and I have 3 sies

在查看源代码时,似乎Ember.get通过meta对象解析计算属性(来源:https://github.com/emberjs/ember.js/blob/v1.1.2/packages/ember-metal/lib/property_get.js#L66)。我可以通过在元对象t[Ember.META_KEY].desc周围查看所有属性的列表,但我不清楚该如何处理元对象。

如何修改元对象以允许计算属性和绑定与新重新分配的原型一起使用?

1 个答案:

答案 0 :(得分:0)

真正的答案是你不应该这样做。 Ember在引擎盖下设置了很多,试图手动撕掉内胆并重新构建它们绝对不推荐。

我确信有更好的解决方案,比如将属性复制到对象的新实例。

或者,如果您使用的是Ember Data,则可以使用多态关系。