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) 所讀取。沒有其他任何方式來設置或讀取這個值。


MDN傳送門

創建一個用戶自定義的對象需要兩步:

通過編寫函數來定義對象類型。
通過new來創建對象實例。

創建一個對象類型,需要創建一個指定其名稱和屬性的函數;對象的屬性可以指向其他對象,看下面的例子:

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

一個繼承自 Person.prototype 的新對象被創建。

使用指定的參數調用構造函數 Person,並將 this 綁定到新創建的對象。new Person等同於 new Person(),也就是沒有指定參數列表,Person不帶任何參數調用的情況。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章