2012-11-26 99 views
4

我想在JavaScript中使用Object.Create。目前,我有以下代碼:使用Object.Freate添加函數到JavaScript對象創建

var vehicle = { 
     getModel: function() { 
     console.log("The model of this vehicle is.." + this.model); 
    } 
}; 

var car = Object.create(vehicle, { 
    "id": { 
     value: 9,   
    }, 
    "model": { 
     value: "Ford", 
    } 
}); 

var van = Object.create(vehicle, { 
    "id": { 
    value: 10,  
    }, 
    "model": { 
     value: "Big Van", 
     enumerable: true 
    }, 
    "make": { 
     value: "Warrior",  
    }, 
    "getMake": function() { 
     console.log("The make of this vehicle is.." + this.make); 
    } 
}); 

我試圖將函數添加到麪包車getMake,但我得到的錯誤:

TypeError: Property 'getMake' of object # is not a function when I call:

van.getMake();

這可能嗎?你怎麼做呢?

+2

我從來沒有使用過'Object.create' ... –

+0

不僅我從來沒有使用它,但我不知道它甚至存在... –

回答

5

以這種方式創建的屬性默認情況下不是可枚舉的。這可能會導致您的問題。

試試這個(未經測試):

"getMake": { value: function() { 
     console.log("The make of this vehicle is.." + this.make) 
    }, enumerable: true }; 

編輯看起來這是工作,因爲我們傳遞一個對象,而不僅僅是值。枚舉是不必要的。

+0

它的工作出色 - 謝謝瑞恩。 – davy

+2

不需要財產是可枚舉的。 –

+2

我與@dystroy,我甚至會爭辯說,當迭代一個對象('for(var p in obj)')時,該屬性最好定義爲'enumerable:false',你通常不想處理與方法 –

2

你需要傳遞一個對象定義屬性,而不僅僅是值:

"getMake": {value:function() { 
    console.log("The make of this vehicle is.." + this.make); 
}} 

Reference

注意,通常的方式做OOP的Javascript是不使用的Object.create但在使用prototype

+0

謝謝。爲什麼?是Object.create不好的做法? – davy

+0

以我自己的觀點來看,它很醜,沒用和** [慢](http://jsperf.com/object-create-vs-constructor-vs-object-literal/7)**。但是,與大多數js編碼器一樣,我從不使用Object.create,所以我可能會錯過它的一些優點。 –

+0

好的,我現在看看原型。 – davy

相關問題