我们可以像这样创建Em.Object:
var foo = Em.Object.create({
somevar : '123'
});
然后使用它:
foo.get('somevar');
但是如何在Em.Object中创建一个私有属性或方法,它可以从对象访问但不是我们的?
答案 0 :(得分:8)
确实有一种在Ember对象中拥有私有变量的方法,如下所示:
MyObject = Ember.Object.extend({
init: function() {
// private variable
var a = 1;
// methods to get, set, or otherwise accesss the private variables
this.getA = function() {return a;};
this.setA = function(val) {a = val;}
// don't forget this!
this._super(...arguments);
}
});
现在尝试
o1 = MyObject.create()
o2 = MyObject.create()
o1.setA(42);
o2.getA(); //1
换句话说,您必须在init
挂钩中声明私有变量,以及任何想要使用它们的getter,setter或其他例程。当然,这意味着那些getter / setter将出现在类的每个实例上,而不是它的原型中。这样效率稍低,但对于JavaScript中的类的私有变量的任何方法都是如此。
可以想象Ember可以在对象上引入新的private: {}
哈希值,但是Ember需要很多机制来处理跨类层次结构查找和控制对私有变量的访问。这相当于重新设计或扩展语言本身,这不是Ember任务的一部分。
同时,如果私有实例变量的数量有限并且需要访问它们的例程数量很少,则上述方法可以正常工作。因此,接受的回答是不可能的,这是错误的。
答案 1 :(得分:7)
这是不可能的,因为Ember.js不提供任何封装机制。
但是,您可以简单地为私有成员使用某些约定。例如,在前面添加_
符号。
答案 2 :(得分:0)
您可以使用闭包:
(function() {
var somePrivateProperty = 'xyz';
MyObject = Em.Object.extend({
someComputedProperty: function() {
return 'somePrivateProperty = ' + somePrivateProperty;
}).property()
})
})();
答案 3 :(得分:0)
可以通过一个小技巧:
var obj = Em.Em.Object.create(
new function(){
var privateVar = "this is private";
this.getPrivateVar = function(){
return privateVar ;
}
},
{
emberVar: "Ember var",
emberMethod : function(){
return this.getPrivateVar();
},
emberMethod1 : function(){
return privateVar ;
},
emberBinding : 'emberVar'
}
)
现在如果你试图获得private
var
obj.privateVar
> unknown
obj.getPrivateVar()
> "this is private"
obj.emberMethod()
> "this is private"
唯一的问题是:
obj.emberMethod1()
> unknown