明示的に言うことは、(よく理解しているように)によって参照されている現在のオブジェクトthis.foo
のプロパティに関心があることを意味します。したがって、次を使用する場合: equalsによって参照される現在のオブジェクトのプロパティを に設定します。foo
this
this.foo = 'bar';
foo
this
bar
JavaScriptのthis
キーワードは、C++ のように常に同じことを意味するとは限りません。ここで例を挙げることができます:
function Person(name) {
this.name = name;
console.log(this); //Developer {language: "js", name: "foo"} if called by Developer
}
function Developer(name, language) {
this.language = language;
Person.call(this, name);
}
var dev = new Developer('foo', 'js');
Person
上記の例では、関数のコンテキストで関数を呼び出しているDeveloper
ためthis
、 によって作成されるオブジェクトを参照していますDeveloper
。console.log
結果からわかるように、 からthis
来ていDeveloper
ます。メソッドの最初の引数でcall
、関数が呼び出されるコンテキストを指定します。
単純に使用しない場合this
、作成したプロパティはローカル変数になります。ご存じかもしれませんが、JavaScript には関数スコープがあるため、変数はローカルになり、変数が宣言されている関数に対してのみ表示されます (もちろん、親内で宣言されているすべての子関数です)。次に例を示します。
function foo() {
var bar = 'foobar';
this.getBar = function () {
return bar;
}
}
var f = new foo();
console.log(f.getBar()); //'foobar'
var
これは、キーワードを使用する場合に当てはまります。これは、残念ながらグローバルになるbar
ことを忘れた場合、ローカル変数として定義していることを意味します。var
bar
function foo() {
bar = 'foobar';
this.getBar = function () {
return bar;
}
}
var f = new foo();
console.log(window.bar); //'foobar'
まさにローカル スコープは、OOP の最大の利点の 1 つであるプライバシーとカプセル化を実現するのに役立ちます。
実際の例:
function ShoppingCart() {
var items = [];
this.getPrice = function () {
var total = 0;
for (var i = 0; i < items.length; i += 1) {
total += items[i].price;
}
return total;
}
this.addItem = function (item) {
items.push(item);
}
this.checkOut = function () {
var serializedItems = JSON.strigify(items);
//send request to the server...
}
}
var cart = new ShoppingCart();
cart.addItem({ price: 10, type: 'T-shirt' });
cart.addItem({ price: 20, type: 'Pants' });
console.log(cart.getPrice()); //30
JavaScript スコープの利点のもう 1 つの例は、モジュール パターンです。モジュール パターンでは、JavaScript のローカル機能スコープを使用してプライバシーをシミュレートできます。このアプローチでは、プライベート プロパティとメソッドの両方を持つことができます。次に例を示します。
var module = (function {
var privateProperty = 42;
function privateMethod() {
console.log('I\'m private');
}
return {
publicMethod: function () {
console.log('I\'m public!');
console.log('I\'ll call a private method!');
privateMethod();
},
publicProperty: 1.68,
getPrivateProperty: function () {
return privateProperty;
},
usePublicProperty: function () {
console.log('I\'ll get a public property...' + this.publicProperty);
}
}
}());
module.privateMethod(); //TypeError
module.publicProperty(); //1.68
module.usePublicProperty(); //I'll get a public property...1.68
module.getPrivateProperty(); //42
module.publicMethod();
/*
* I'm public!
* I'll call a private method!
* I'm private
*/
匿名関数を親なしでラップするという少し奇妙な構文がありますが、しばらく忘れてください (初期化された後に関数を実行しているだけです)。機能は使用例から見ることができますが、利点は主に、すべての実装の詳細に関与しない単純なパブリック インターフェイスを提供することに関連しています。パターンの詳細な説明については、上記のリンクを参照してください。
this
:-) の情報で、JavaScript のいくつかの基本的なトピックを理解するのに役立つことを願っています。