[英]Ember.js: Dynamically changing the 'class' of an Ember object via prototype and meta
我想知道是否有可能更改現有對象實例的“類”(從Ember.Object.extend
派生),例如計算屬性,Ember的_super
/繼承/ mixins,綁定,觀察者,以及其他所有好處Ember Object模型仍然有效。
我試過簡單地將__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
元對象t[Ember.META_KEY].desc
來查看所有屬性的列表,但是我不清楚該元對象到底要做什么。
如何修改元對象以允許計算的屬性和綁定與新重新分配的原型一起使用?
真正的答案是您不應該這樣做。 灰燼在引擎蓋下設置了很多東西,絕對不建議嘗試手動撕破膽量並重新構建它們。
我確信有更好的解決方案,例如將屬性復制到對象的新實例中。
或者,如果您使用的是Ember Data,則可以使用多態關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.