次のようにEm.Objectを作成できます。
var foo = Em.Object.create({
somevar : '123'
});
そしてそれを使用します:
foo.get('somevar');
しかし、オブジェクトからアクセスできるが、私たちの側にはないプライベートプロパティまたはメソッドをEm.Objectに作成するにはどうすればよいですか?
次のようにEm.Objectを作成できます。
var foo = Em.Object.create({
somevar : '123'
});
そしてそれを使用します:
foo.get('somevar');
しかし、オブジェクトからアクセスできるが、私たちの側にはないプライベートプロパティまたはメソッドをEm.Objectに作成するにはどうすればよいですか?
次のように、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の使命の一部ではない、言語自体を再設計または拡張することと同じです。
一方、上記のアプローチは、プライベートインスタンス変数の数が制限されていて、それらにアクセスする必要のあるルーチンの数が少ない場合にうまく機能します。したがって、これは不可能であるという受け入れられた答えは、まあ、間違っています。
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'
}
)
今、Uがprivate
varを取得しようとすると
obj.privateVar
> unknown
obj.getPrivateVar()
> "this is private"
obj.emberMethod()
> "this is private"
唯一の問題は次のとおりです。
obj.emberMethod1()
> unknown