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オペレータを使って、関数を呼び出してもいいですか?
このような方法はおかしい(javac#に対して)が、確かにできる.
従来の経験によれば、関数の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タイプのオブジェクトである.(グローバル で び された)「 のWindowthisタイプでなくても」
  • は の にあります.
  • の がWindowによって び された 、new funcName(args);thisタイプのオブジェクトである.
  • の がfuncNameオペレータを して び されていない 、 の び しだけで(new)、var result = funcName(args);thisタイプのオブジェクトである.
  • したがって、コンストラクタモードによって かに しいオブジェクトが されました.また、このオブジェクトは のタイプがあり、タイプによって できます.
    まとめ:
  • の は、Windowを して び さないと、 の び しであり、 のnewは、 の び しの である.( を んだのはthisです.)
  • の の は、thisを して び された となり、 は しいオブジェクトタイプを します. しいオブジェクトタイプ は の で、 のnewタイプはこの しいオブジェクトタイプです.