javascript:コンストラクションモード(なぜこのような方式でオブジェクトを作ることができるのですか?)
6939 ワード
ECMAScript
におけるコンストラクタは、特定のタイプのオブジェクトを作成するために使用されてもよい.Object
およびArray
のようなオリジナルコンストラクタは、実行環境に自動的に現れる.また、カスタムオブジェクトタイプの属性と方法を定義するために、カスタムのコンストラクタを作成することもできます.例えば、構造関数モードを使用して、前の例を書き換えることができる.以下のとおりですfunction Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function () {
return this.name;
};
}
var p1 = new Person("Ann" , 23 , "actress");
var p2 = new Person("Rose" , 23 , "writer");
上記の内容を見た時、私は驚きました.javascript
の呼び出し関数は、新しいオブジェクトを作成できますか?new
オペレータを使って、関数を呼び出してもいいですか?このような方法はおかしい(
java
、c#
に対して)が、確かにできる.従来の経験によれば、関数の
this
は現在の実行環境変数であるからである.一般に、ウェブページ上のグローバル環境内で関数を呼び出す場合、関数内部のthis
オブジェクトはwindow
オブジェクトである.しかし、ここのthis
は新しいタイプのオブジェクトのようです.なぜですか以下は私の小テストです.このように関数を呼び出すと、本当に
Person
オブジェクトが変更されましたか?1は、
this
を使用して、コンストラクタのコードを呼び出します.console.log("<>>>before this Window ? " + (this instanceof Window));
function Person(name, age, job) {
console.log("inner this Window ? " + (this instanceof Window));
console.log("inner this Person ? " + (this instanceof Person));
this.name = name;
this.age = age;
this.job = job;
this.sayName = function () {
return this.name;
};
}
var p1 = new Person("Ann", 23, "actress");
// todo: new
console.log("outer this Window ? " + (this instanceof Window));
console.log("outer this Person ? " + (this instanceof Person));
//
/**
// todo: :
<>>>before this Window ? true
inner this Window ? false
inner this Person ? true
outer this Window ? true
outer this Person ? false
*/
2はnew
を せず、 コンストラクタのコードを び します.console.log("<>>>before this Window ? " + (this instanceof Window));
function Person(name, age, job) {
console.log("inner this Window ? " + (this instanceof Window));
console.log("inner this Person ? " + (this instanceof Person));
this.name = name;
this.age = age;
this.job = job;
this.sayName = function () {
return this.name;
};
}
var p1 = Person("Ann", 23, "actress"); // : new
console.log("outer this Window ? " + (this instanceof Window));
console.log("outer this Person ? " + (this instanceof Person));
/*
// todo: :
<>>>before this Window ? true
inner this Window ? true
inner this Person ? false
outer this Window ? true
outer this Person ? false
*/
じコードでも、 び し には にnew
オペレータを してnew
を び すだけで、 もありません.そして の は じではありません.Person()
から られます.は の にあり、log
は にthis
タイプのオブジェクトである.(グローバル で び された)「 のWindow
がthis
タイプでなくても」 は の にあります. の がWindow
によって び された 、new funcName(args);
はthis
タイプのオブジェクトである. の がfuncName
オペレータを して び されていない 、 の び しだけで(new
)、var result = funcName(args);
はthis
タイプのオブジェクトである. したがって、コンストラクタモードによって かに しいオブジェクトが されました.また、このオブジェクトは のタイプがあり、タイプによって できます.
まとめ:の は、Window
を して び さないと、 の び しであり、 のnew
は、 の び しの である.( を んだのはthis
です.) の の は、this
を して び された となり、 は しいオブジェクトタイプを します. しいオブジェクトタイプ は の で、 のnew
タイプはこの しいオブジェクトタイプです.