我們可以通過構造器函數(簡稱構造函數)來創建對象: 為了使用該函數來創建對象,我們需要使用new操作符,例如: 使用構造函數創建對象的好處就是她可以接受一些參數,下麵我們就來修改一下上面的例子: 現在,我們就能利用同一個構造函數創建不同的對象了: 按照慣例,我們應該將構造函數的首字母大寫,以便區分一 ...
我們可以通過構造器函數(簡稱構造函數)來創建對象:
function Her(){ this.child = 'Jon'; }
為了使用該函數來創建對象,我們需要使用new操作符,例如:
var she = new Hew(); she.child; // Jon
使用構造函數創建對象的好處就是她可以接受一些參數,下麵我們就來修改一下上面的例子:
function Her(name){ this.name = name; this.child = 'Jon; this.whoAreYou = function(){ return 'I am' + this.name + 'My child is' + this.child; } }
現在,我們就能利用同一個構造函數創建不同的對象了:
var her1 = new Her('A'); var her2 = new Her('B');
按照慣例,我們應該將構造函數的首字母大寫,以便區分一般函數。
如果我們在調用一個構造函數的時候忽略了new操作符,儘管代碼不會出錯但她的運行結果往往會出人意料!
var a = Her('A'); console.log(typeof a); // undefined
由於我們沒有使用new操作符,那我們就不是在創建一個新的對象。這個函數調用與其它函數並沒有神馬區別,這裡的a就應該是函數的返回值,由於Her()函數沒有顯式的返回值(return關鍵字返回),所以說便隱式的返回了undefined,並將該值賦給了a。
那麼這時候的this指向的是誰呢?答案是window.
當我們創造對象的時候,實際上同時也賦予了該對象的一種特殊的屬性---即構造器屬性(constructor prototype)。該屬性實際上是一個指向用於創建該對象的構造器函數的引用。
function Her(){ this.name = 'Anna'; } var she = new Her(); cosole.log(she.constructor); // function Her(){ // this.name = 'Anna'; //}
當然,由於構造器函數引用的是一個函數,因此我們可以利用她來創建另一個新對象:
var her2 = new Her.constructor()
大意就是:‘無論對象her2有沒有被創建,我們都可以用她來創建另一個對象’。
另外,如果對象是通過‘{}’這種方式被創建的,那麼實際上她就是由內建函數Object()函數所創建的:
var o = {}; console.log(o.constructor); //function Object(){} console.log(typeof o.constructor) // function
instanceof 操作符
可以測試某個對象是不是由某個指定的構造函數創建的。
function Hero(){}; var h = new hero(); var o = {}; cosole.log(h instanceof Hero) //true
請註意,這裡的函數名Hero後面沒有加(),因為這是函數的引用而不是調用。