彼が行くところに着く前に、最初のステップは得ることthis
です。
this
通常、指摘できることが3つあります。オブジェクトのプロパティである関数がある場合:
var Bob = {
name : "Bob",
say : function () { console.log(this.name); }
};
Bob.say(); // "Bob"
この場合、this
プロパティを所有しているオブジェクトを指します(関数が呼び出された瞬間に、1ドット先にあるものは何でも)
var say = Bob.say; // passing the function to a variable
var Sam = { name : "Sam" };
Sam.say = Bob.say; // passing the function to an object's property
say(); // undefined -- not what you were expecting
Sam.say(); // "Sam"
したがってthis
、最後の可能な秒で決定されます。
関数には、オブジェクトのような独自のプロパティもあります。
これらのうちの2つはとと呼ばれる関数で.call
あり.apply
、関数を実行できますが、関数に正確に何this
であるかを伝えます。
say();
それ自体ではどのように機能しなかったか覚えていますか?
var say = Bob.say;
say.call(Bob); // "Bob" -- hooray!
の次の部分this
は、オブジェクト指向言語で最も慣れている部分です。this
と一緒に使用しnew
て、クラスの新しいインスタンスを作成します。
var Person = function (name) {
this.name = name;
this.say = function () { console.log(this.name); };
};
var bob = new Person("Bob");
bob.say(); // "Bob"
基本的に、このコンストラクター関数(またはコンストラクターはJSで特別ではないため、任意の関数)の内部では、関数new
は呼び出されたかどうかを確認することから始まります。
そうであった場合はthis
、オブジェクトの一部であるかどうかに関係なく、新しいオブジェクトに設定します。
var Creatures = {};
Creatures.Person = Person;
Creatures.Person("Bob"); // `this` === Creatures
Creatures.name; // "Bob" -- whoops
var bob = new Creatures.Person("Bob");
bob.say(); // "Bob", yay!
if (new) { this = {}; }
つまり、関数が関数の上部で言っているようなものです。
私は3つの可能性があると言いました。
3つ目は、がオブジェクトではなく(call / applyを介して、またはオブジェクトのプロパティとして)、新しいオブジェクトの作成に使用されなかっthis === window
た関数を使用する場合、を指すことです。
そのため、以前は単独では機能しませんでした。同等です。this
new
this
window
say();
window.say();
少し戻ってnew
-new
他のいくつかのことをします。
つまり、オブジェクトのコンストラクターの値を設定します。
var bob = new Person();
bob instanceof Person; // true
また、そのコンストラクターから作成されたprototype
オブジェクトに、すべてのインスタンスが共有するオブジェクトへのアクセスを提供します。
では、Class/Klassの内部で何が起こっているかを見てみましょう。オブジェクト
を作成しています。関数
の内部(ので)。
次に、新しい「コンストラクター」関数を作成しています。 new Class();
Class
this = {};
new
klass
次に、プロトタイプ化されinit
た関数を設定します。これは.apply
、新しいものに設定しますthis
(でklass
、新しいインスタンスが呼び出されたとき)。
次に、クラスを返します。
klassは、実際には、新しいクラスを作成するときに呼び出しているものです。
そして、クラスの新しいオブジェクトを呼び出すと、klassが実行されます。
new
それがandthis
と.call
andに役立つことを願っていますClass/klass
。