2014-01-23 72 views
2

我目前正在使用馬爾可夫鏈進行聊天AI。一個後端的對象是一個對象,一個字符串映射到它的一部分的任何鏈,使得:有沒有辦法使'構造函數'在JS對象中有效的鍵?

var words = {} 

words['test'] = [ ['this','is','a','test'], ['this','too','tests','things'] ] 

現在,我有一個問題。 '構造函數'是一個完全合法的詞,但它看起來好像你不能像上面描述的那樣映射它,因爲'構造函數'是JS中每個對象的屬性(當然還有其他的東西)。所以對我的問題:有沒有辦法構建這張地圖?

+0

你不能使用構造函數嗎? – elclanrs

+0

@elclanrs我想你錯過了這個問題的重點:我只是想要一張地圖;不需要任何對象功能。 – Seiyria

回答

7

constructor不是每個對象的屬性。儘管默認情況下,每個使用字面語法創建的對象的原型鏈中都有constructor。這是因爲那些對象從具有該屬性的Object.prototype繼承。

一個解決方案是使用沒有原型鏈的對象。

var words = Object.create(null); 

words['test'] = [ ['this','is','a','test'], ['this','too','tests','things'] ]; 

現在將不會有遺傳屬性混淆的東西。這不會在IE8和更低的工作。


另一種解決方案是使用.hasOwnProperty()以查看是否constructor屬性是對象本身或繼承上。如果繼承,那麼它不是你想要的。

if (words.hasOwnProperty("constructor")) 
    console.log(words.constructor); 

如果條件通過,那麼我們就知道我們沒有使用繼承的財產,而是對象自身的屬性。

+2

如果密鑰'hasOwnProperty'已被覆蓋,'.hasOwnProperty'將會出現問題。將對象用作哈希映射的推薦解決方案是使用'has'函數,例如'function has(obj,key){return Object.prototype.hasOwnProperty.call(obj,key)}'。 – zzzzBov

+0

@zzzzBov:如果'hasOwnProperty'可能是'words'的一個屬性,將原型映射到陰影,那麼這將有所幫助。但是,如果'。hasOwnProperty()'被實際覆蓋*,使用'Object.prototype.hasOwnProperty'不會真的有幫助。也許你是指陰影。 –

+0

嘿,謝謝!我從來不知道'Object.create(null)',那就是訣竅。 – Seiyria

相關問題