2

オブジェクトリテラルは静的オブジェクトと見なされます。

したがって、オブジェクトリテラルには静的変数のみを含める必要がありますが、次のコードでは

var obj = {
    a : "hello",
    foo : function(){
        console.log(this.a);
        console.log(obj.a);
    }
};

a静的な方法obj.aと非静的な方法でにアクセスできますthis.a

a静的変数ですか?

4

4 に答える 4

5

あなたはたくさんの異なることを混乱させていると思います。

obj。という名前のフィールドを持つという名前のオブジェクトを作成しましたa。そのフィールドには、としてobj.a(または必要obj['a']に応じて)アクセスできます。他の変数が参照するように調整すると、objその変数を介して利用することもできます。

他の変数が指すように調整する1つの方法は、関数/クロージャとして定義されてobjいるフィールドを取得し、のようにobj「メソッド」構文を使用して呼び出すことobj.foo()です。つまり、の本体の内部ではfoo、その呼び出しの間、特別な変数thisがを参照しobjます。したがって、その関数内のコードはをobj.a介してアクセスできますthis.a

これは、静的スコープと動的スコープ、シングルトン、「クラス」と「インスタンス」のメンバー、またはそれらのいずれとも関係がありません。それはただのオブジェクトです。

于 2013-01-24T14:37:23.300 に答える
3

オブジェクトリテラルは静的クラスではなく、Object ;のインスタンスです。したがって、obj.a静的にすることもできません。おそらく混乱は、{}表記法が実際にオブジェクトを作成するという事実にあります。

typeof {
    a : "hello",
    foo : function(){
        console.log(this.a);
        console.log(obj.a);
    }
};

"object"

これは次と同等です。

var obj = new Object();
obj.a = 'hello';
obj.foo = function() {}

結論

静的プロパティはクラス指向の言語でのみ意味を持ちますが、JavaScriptのクラスの同じ概念はおそらく存在しません。

于 2013-01-24T14:36:13.723 に答える
1

obj.aあなたがそれを参照する方法である「静的」です。thisこの方法で使用するのは、を使用する場合のみです。new obj()したがってobj、関数である必要があります。

デフォルトthisでは、オブジェクトメンバーである関数内で使用される場合、親オブジェクトを参照します。コードの場合はobj親オブジェクトです。

プロトタイプの使用例とthis

var Obj = function(){this.a = "hi"};
Obj.prototype.foo = function(){
    console.log(this.a);
}
Obj.b = "sth";
var myObj = new Obj();
myObj.foo(); // "hi"
console.log(myObj.b); // undefined
于 2013-01-24T14:32:53.210 に答える
1

これはそれほど単純ではありません、チェックしてください

 let baba = {
    a: 12,
    foo: function () {
        baba.a = 13;
        this.a = 14;
    },
    roo: function () {
        alert("baba.a = " + baba.a + "\nthis.a = " + this.a);
    }
};
var theApp = {
    start_action: function () {

        let sola = Object.create(baba);
        sola.foo();
        sola.roo();

        let bola = Object.create(baba);
        bola.roo();            
    }
}
$(document).ready(theApp.start_action);

roo()呼び出し後の最初のfooへの呼び出し:13、14 fooへの2番目の呼び出し13、13

于 2020-03-06T15:48:49.733 に答える