12

我们可以像这样创建 Em.Object:

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

然后使用它:

foo.get('somevar');

但是如何在 Em.Object 中创建可以从对象访问但不在我们身边的私有属性或方法?

4

4 回答 4

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 使命的一部分。

同时,如果私有实例变量的数量有限并且需要访问它们的例程数量很少,则上述方法也可以正常工作。所以说这是不可能的公认答案是错误的。

于 2014-04-12T03:47:51.837 回答
7

这是不可能的,因为 Ember.js 不提供任何封装机制。

但是,您可以简单地为私有成员使用一些约定。例如,在它们前面加上_符号。

于 2012-08-27T13:14:27.970 回答
0

您可以使用闭包:

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

    MyObject = Em.Object.extend({
        someComputedProperty: function() {
            return 'somePrivateProperty = ' + somePrivateProperty;
        }).property()
    })
})();
于 2012-08-27T21:31:00.553 回答
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'
    }
)

现在如果你尝试获取privatevar

obj.privateVar 
> unknown

obj.getPrivateVar()
> "this is private"

obj.emberMethod()
> "this is private"

唯一的问题是:

obj.emberMethod1()
> unknown
于 2012-09-14T09:08:03.583 回答