在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創建的對象。(一般情況下,構造函數不返回值,但是用戶可以選擇主動返回對象,來覆蓋正常的對象創建步驟)