オブジェクトリテラルは静的オブジェクトと見なされます。
したがって、オブジェクトリテラルには静的変数のみを含める必要がありますが、次のコードでは
var obj = {
a : "hello",
foo : function(){
console.log(this.a);
console.log(obj.a);
}
};
a
静的な方法obj.a
と非静的な方法でにアクセスできますthis.a
。
a
静的変数ですか?
オブジェクトリテラルは静的オブジェクトと見なされます。
したがって、オブジェクトリテラルには静的変数のみを含める必要がありますが、次のコードでは
var obj = {
a : "hello",
foo : function(){
console.log(this.a);
console.log(obj.a);
}
};
a
静的な方法obj.a
と非静的な方法でにアクセスできますthis.a
。
a
静的変数ですか?
あなたはたくさんの異なることを混乱させていると思います。
obj
。という名前のフィールドを持つという名前のオブジェクトを作成しましたa
。そのフィールドには、としてobj.a
(または必要obj['a']
に応じて)アクセスできます。他の変数が参照するように調整すると、obj
その変数を介して利用することもできます。
他の変数が指すように調整する1つの方法は、関数/クロージャとして定義されてobj
いるフィールドを取得し、のようにobj
「メソッド」構文を使用して呼び出すことobj.foo()
です。つまり、の本体の内部ではfoo
、その呼び出しの間、特別な変数this
がを参照しobj
ます。したがって、その関数内のコードはをobj.a
介してアクセスできますthis.a
。
これは、静的スコープと動的スコープ、シングルトン、「クラス」と「インスタンス」のメンバー、またはそれらのいずれとも関係がありません。それはただのオブジェクトです。
オブジェクトリテラルは静的クラスではなく、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のクラスの同じ概念はおそらく存在しません。
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
これはそれほど単純ではありません、チェックしてください
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