Ответ 1
Это невозможно, так как Ember.js не предоставляет никаких механизмов инкапсуляции.
Однако вы можете просто использовать некоторые соглашения для частных членов. Например, прикрепите их знаком _
.
Мы можем создать Em.Object следующим образом:
var foo = Em.Object.create({
somevar : '123'
});
а затем используйте его:
foo.get('somevar');
но как создать частное свойство или метод в Em.Object, который будет доступен из объекта, но не будет нашим?
Это невозможно, так как Ember.js не предоставляет никаких механизмов инкапсуляции.
Однако вы можете просто использовать некоторые соглашения для частных членов. Например, прикрепите их знаком _
.
В 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
. Конечно, это означает, что эти геттеры/сеттеры будут присутствовать на каждом экземпляре класса, а не в его прототипе. Это немного неэффективно, но то же самое справедливо для любого подхода к закрытым переменным для классов в JavaScript.
Можно предположить, что Ember может ввести новый хэш-код private: {}
для объектов, но тогда Ember понадобится много механизмов для обработки и контроля доступа к закрытым переменным в иерархиях классов. Это было бы эквивалентно перепроектированию или расширению самого языка, который не является частью миссии Ember.
Между тем, вышеупомянутый подход работает отлично, если количество частных экземпляров экземпляра ограничено, а количество подпрограмм, которые требуют доступа к ним, невелико. Таким образом, принятый ответ, в котором говорится, что это невозможно, - это неправильно.
Вы можете использовать закрытие:
(function() {
var somePrivateProperty = 'xyz';
MyObject = Em.Object.extend({
someComputedProperty: function() {
return 'somePrivateProperty = ' + somePrivateProperty;
}).property()
})
})();
Возможно с небольшим трюком:
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'
}
)
теперь, если U попытается получить private
var
obj.privateVar
> unknown
obj.getPrivateVar()
> "this is private"
obj.emberMethod()
> "this is private"
Единственная проблема в том, что:
obj.emberMethod1()
> unknown