1. 程式人生 > >JavaScript (new)建立一個物件的過程

JavaScript (new)建立一個物件的過程

在JavaScript的世界中,物件Object的操作是比較靈活的,可以通過建立一個物件,來進行繼承,拓展,而且物件的屬性是極其容易拓展的。

所以建立一個物件例項流程可以是這樣子的:

     function Person(name , age){
         this.name = name;
         this.age = age;
         console.log(this); // Person {name: "neo", age: "23"}
         //return this; 預設隱藏
     }
     var p1 = new Person('neo'
,'10'); console.log(p1.name); 等同於: function Person(name , age){ this.name = name; this.age = age; console.log(this); //window return this; } var p1 = new Object(); //var p1 = {} p1 = Person('neo','23'); console.log(p1.name);

new 關鍵字做了什麼

在 JavaScript 中,使用 new 關鍵字後,意味著做了如下四件事情:

建立一個新的物件,這個物件的型別是 object;

設定這個新的物件的內部、可訪問性和[[prototype]]屬性為建構函式(指prototype.construtor所指向的建構函式)中設定的;

執行建構函式,當this關鍵字被提及的時候,使用新建立的物件的屬性; 返回新建立的物件(除非構造方法中返回的是‘無原型’)。

在建立新物件成功之後,如果呼叫一個新物件沒有的屬性的時候,JavaScript 會延原型鏈向止逐層查詢對應的內容。這類似於傳統的‘類繼承’。

注意:在第二點中所說的有關[[prototype]]屬性,只有在一個物件被建立的時候起作用,比如使用 new 關鍵字、使用 Object.create 、基於字面意義的(函式預設為 Function.prototype ,數字預設為 Number.prototype 等)。它只能被Object.getPrototypeOf(someObject) 所讀取。沒有其他任何方式來設定或讀取這個值。

建立一個使用者自定義的物件需要兩步:

通過編寫函式來定義物件型別。
通過new來建立物件例項。

建立一個物件型別,需要建立一個指定其名稱和屬性的函式;物件的屬性可以指向其他物件,看下面的例子:

當代碼 new Person(…) 執行時,會發生以下事情:

一個繼承自 Person.prototype 的新物件被建立。

使用指定的引數呼叫建構函式 Person,並將 this 繫結到新建立的物件。new Person等同於 new Person(),也就是沒有指定引數列表,Person不帶任何引數呼叫的情況。

由建構函式返回的物件就是 new 表示式的結果。如果建構函式沒有顯式返回一個物件,則使用步驟1建立的物件。(一般情況下,建構函式不返回值,但是使用者可以選擇主動返回物件,來覆蓋正常的物件建立步驟)