【问题标题】:Is there a way to make 'constructor' a valid key in a JS object?有没有办法让“构造函数”成为 JS 对象中的有效键?
【发布时间】:2014-02-14 17:08:33
【问题描述】:

我目前正在制作一个使用马尔可夫链的聊天 AI。后端对象之一是将字符串映射到它所属的任何链的对象,例如:

var words = {}

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

现在,我有一个问题。 'constructor' 是一个完全有效的词,但它看起来好像你不能像我上面描述的那样映射它,因为'constructor' 是 JS 中每个对象的属性(当然还有其他东西)。所以我的问题是:有没有办法构建这张地图?

【问题讨论】:

  • 不能用构造函数吗?
  • @elclanrs 我认为您错过了问题的重点:我只是想要一张地图;不需要对象功能。

标签: javascript


【解决方案1】:

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);

如果条件通过,那么我们知道我们使用的不是继承的属性,而是对象自己的属性。

【讨论】:

  • .hasOwnProperty 如果密钥 hasOwnProperty 已被覆盖,则会出现问题。将对象用作哈希映射的推荐解决方案是使用has 函数,例如function has(obj, key) { return Object.prototype.hasOwnProperty.call(obj, key) }。
  • @zzzzBov:如果hasOwnProperty 可以是words 上的一个自己的属性,遮蔽原型,那会有所帮助。但如果.hasOwnProperty() 实际上被覆盖,那么使用Object.prototype.hasOwnProperty 并没有真正的帮助。也许你指的是阴影。
  • 嘿,谢谢!我从来不知道Object.create(null),这成功了。
  • @cookiemonster,我不确定我是否理解你的意思。 Object.prototype.hasOwnProperty.call 调用 obj 上的函数引用,而不使用 obj 上的 hasOwnProperty 属性。这样它就可以用于obj = {hasOwnProperty: 'break everything'}等示例。
  • @zzzzBov:对。您提到了覆盖,这意味着 Object.prototype.hasOwnProperty 本身已被更改。您的 obj = {hasOwnProperty: 'break everything'} 示例并没有真正覆盖它。它只是遮蔽它。在那种情况下,你是对的。从原型中获取.hasOwnProperty 将是可行的方法。
猜你喜欢
  • 2015-10-11
  • 2010-09-06
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多