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

Ember.js 如何在Ember.Object中创建私有方法/属性?,ember.js,Ember.js,我们可以创建Em。对象如下: var foo=Em.Object.create({ somevar:'123' }); 然后使用它: foo.get('somevar'); 但是,如何在Em.Object中创建一个私有属性或方法,该属性或方法可以从对象访问,但不会是我们自己的?这是不可能的,因为Ember.js不提供任何封装机制 但是,您可以简单地对私有成员使用一些约定。例如,在它们前面加上符号。可以使用闭包: (function() { var somePrivatePropert

我们可以创建Em。对象如下:

var foo=Em.Object.create({
somevar:'123'
});
然后使用它:

foo.get('somevar');

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

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


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

可以使用闭包:

(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'
    }
)
现在,如果您尝试获取
private
var

obj.privateVar 
> unknown

obj.getPrivateVar()
> "this is private"

obj.emberMethod()
> "this is private"
唯一的问题是:

obj.emberMethod1()
> unknown

确实有一种方法可以在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
hook中声明私有变量,以及任何要使用它们的getter、setter或其他例程。当然,这意味着这些getter/setter将出现在类的每个实例上,而不是在其原型中。这有点低效,但JavaScript中类的私有变量的任何方法都是如此

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


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

明白了,thanx!有趣的是,ember的作者对提交这种功能感兴趣吗?对于五年后来到这里的访客,请注意这个(被接受的)答案是错误的。是的,但是MyObject.get('someComputedProperty')几乎可以在任何不起作用的地方使用,因为
somePrivateProperty
将在所有实例之间共享。这不起作用,因为
privateVar
将在所有实例之间共享。这应该被投票表决,因为它是正确的答案,并且从Ember 2.0开始仍然相关