2014-01-23 76 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

相关问题