如何在Ember.Object中创建私有方法/属性?

Ili*_*akh 12 ember.js

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

var foo = Em.Object.create({
   somevar : '123'
});
Run Code Online (Sandbox Code Playgroud)

然后使用它:

foo.get('somevar');
Run Code Online (Sandbox Code Playgroud)

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

小智 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);
  }
});
Run Code Online (Sandbox Code Playgroud)

现在试试

o1 = MyObject.create()
o2 = MyObject.create()
o1.setA(42);
o2.getA(); //1
Run Code Online (Sandbox Code Playgroud)

换句话说,您必须在init钩子中声明私有变量,以及任何想要使用它们的getter,setter或其他例程.当然,这意味着那些getter/setter将出现在类的每个实例上,而不是它的原型中.这样效率稍低,但对于JavaScript中的类的私有变量的任何方法都是如此.

可以想象,Ember可以private: {}在对象上引入新的哈希,但是Ember需要很多机制来处理查找和控制跨类层次结构的私有变量的访问.这相当于重新设计或扩展语言本身,这不是Ember任务的一部分.

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


s.e*_*ich 7

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

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

  • 对于五年后来到这里的游客,请注意这个(接受的)答案是错误的. (2认同)