Как создать частный метод/свойство в Ember.Object?

Мы можем создать Em.Object следующим образом:

var foo = Em.Object.create({
   somevar : '123'
});

а затем используйте его:

foo.get('somevar');

но как создать частное свойство или метод в Em.Object, который будет доступен из объекта, но не будет нашим?

Ответ 1

Это невозможно, так как Ember.js не предоставляет никаких механизмов инкапсуляции.

Однако вы можете просто использовать некоторые соглашения для частных членов. Например, прикрепите их знаком _.

Ответ 2

В 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.

Между тем, вышеупомянутый подход работает отлично, если количество частных экземпляров экземпляра ограничено, а количество подпрограмм, которые требуют доступа к ним, невелико. Таким образом, принятый ответ, в котором говорится, что это невозможно, - это неправильно.

Ответ 3

Вы можете использовать закрытие:

(function() {
    var somePrivateProperty = 'xyz';

    MyObject = Em.Object.extend({
        someComputedProperty: function() {
            return 'somePrivateProperty = ' + somePrivateProperty;
        }).property()
    })
})();

Ответ 4

Возможно с небольшим трюком:

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