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フックで宣言する必要があります。もちろん、これは、それらのゲッター/セッターが、プロトタイプではなく、クラスの各インスタンスに存在することを意味します。これは少し非効率的ですが、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'
    }
)

今、Uがprivatevarを取得しようとすると

obj.privateVar 
> unknown

obj.getPrivateVar()
> "this is private"

obj.emberMethod()
> "this is private"

唯一の問題は次のとおりです。

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