1

私はまだthis、JavaScript のオブジェクト定義とスコープについて十分に理解していません。以下の (c#ish) 疑似コードは、それを非常にうまくまとめていると思います。

次のすべてのプロパティを持つオブジェクトを作成する JavaScript コードを定義するにはどうすればよいですか。

  1. オブジェクトのメソッド内でのみ表示されるプライベート メンバー
  2. オブジェクトの外でも見えるパブリックメンバー
  3. オブジェクトがインスタンス化され、メンバーが初期化されるときに実行される (パラメーター化された) コンストラクター
  4. オブジェクト自体のメソッドを指すオブジェクト内のコールバックを登録します
  5. メソッド内でコールバックが実行されると ( PrivateMethod)、できればthisポインタを使用して、オブジェクト インスタンスのすべてのメンバーにアクセスできます。

.

class MyObjectDefinition
{
    public int publicField = 0;
    private int privateField;

    public MyObjectDefinition(int parameter)
    {
        this.privateField = parameter;   
        SomethingThatWantsA.CallBack(this.PrivateMethod);
    }

    public void PublicMethod()
    {
        this.privateField--;
        this.publicField--;
    }

    private void PrivateMethod()
    {
        this.privateField++;
        this.publicField++;
    }
}

var instance = new MyObjectDefinition();    
4

3 に答える 3

1

これは、Sencha の Doug Hendricks が JavaScript 変数のスコープと一般的な「実行コンテキスト」(スコープ) を詳細に説明しているビデオへのリンクです。

于 2013-05-17T17:13:24.757 に答える
1
  • 公開 =>this.
  • private => コンストラクター内のローカル変数/関数
  • 正しいコールバック- bindthisを使用するか、ローカル変数に保存します (または伝統的な名前です)。thismethat

次のようなもの:

function MyObjectDefinition()
{
    this.publicField = 0;
    var that = this;
    var privateField;

    this.MyObjectDefinition = function(parameter)
    {
        privateField = parameter;   
        SomethingThatWantsA.CallBack(PrivateMethod);
    }

    this.PublicMethod = function()
    {
        privateField--;
        // or that.publicField--; if you are paranoid/like consistency
        this.publicField--; 
    }

    function PrivateMethod()
    {
        privateField++;
        that.publicField++;
    }
}

var instance = new MyObjectDefinition();   
于 2013-05-17T17:14:30.610 に答える
0

コンストラクターで見られる問題を取り除くために、アレクセイの答えを少し変更しました。

function MyObjectDefinition(parameter)
{
    this.publicField = 0;
    var that = this;
    var privateField;

    this.PublicMethod = function()
    {
        privateField--;
        this.publicField--;
    }

    if(parameter !== undefined)
    {
        privateField = parameter;
        SomethingThatWantsACallBack(PrivateMethod);
        SomethingThatWantsACallBack(this.PublicMethod);
    }

    function PrivateMethod()
    {
        privateField++;  
        that.publicField++;
    }
}

この解決策について私がまだ気に入らないのは、すべてのコンストラクター ロジックをclass. 使用する前にPrivateMethodを定義する必要があるのとは異なります。PublicMethod

于 2013-05-21T09:28:04.883 に答える