【问题标题】:Is it okay to use "create" as a property name in a JavaScript object literal?可以在 JavaScript 对象文字中使用“create”作为属性名称吗?
【发布时间】:2015-03-31 23:40:10
【问题描述】:

我刚刚注意到 IDEA / JSHint 告诉我,包含名为“create”的属性的对象字面量会覆盖 Object 中的方法。

字面量本质上是:

module.exports = {email:{create:"me@me.com"}};

而且(显然?)对象在 EcmaScript5.js 中定义了一个 create 方法

/**
@param {Object} proto
@param {Object} [props]
@static
@return {Object}
*/
Object.create = function(proto,props) {};

这是否会导致一个晦涩的问题?我猜这个保留方法不适用于文字,或者没有用默认构造函数实例化的对象。只是好奇。

【问题讨论】:

  • JS中的保留字:[link]w3schools.com/js/js_reserved.asp应该没问题
  • 说真的,否决票?这只是一个简单的问题。
  • 我没有投反对票.....
  • 感谢@Legends。谢谢你不是巨魔。 =)
  • 我的猜测是,由于它不是保留字,所以有意或无意覆盖它并没有错。

标签: javascript intellij-idea jshint ecmascript-5


【解决方案1】:

现有答案是正确的,但缺少一些重要的细节。您所做的一切都很好,不会在任何 JavaScript 环境中导致错误。

被多次提及的Object.create methodstatic,这意味着它是Object 构造函数本身的属性,而不是其原型。您没有覆盖它,甚至没有遮盖它。它仍然可以访问:

var obj = { create: 'something' };
console.log(obj.create); // 'something'
console.log(Object.create); // function create() { [native code] }

我不确定为什么 JSHint 或任何其他静态分析工具会警告不要使用 create 作为属性标识符,除非可能是因为它可能会引起一些潜在的混淆。

即使您担心create 是 JavaScript 中的保留字也不是问题,因为现代 JavaScript 环境允许使用保留字作为属性标识符,而 create 首先不是保留字:

var obj = {
  default: 1 // Reserved word as identifier
};

因此,总而言之,您可以放心地忽略该警告,并且不必担心您的代码可能产生的任何潜在副作用。

【讨论】:

  • 这是我一直在寻找的答案。感谢您周到的回复,詹姆斯。
【解决方案2】:

它是not reserved,但它在Object 对象上使用(已定义)。

由于文字对象也变成了对象,自定义的 create() 方法将覆盖现有的。

只需为您的方法使用不同的名称。

【讨论】:

    【解决方案3】:

    它不是保留的,它是一个有效的标识符,但是,正如你所说,你在你的文字上覆盖了 Object create 方法。 仅当您尝试在文字上使用 create 时才会影响。

    myModule.email.create(); // Will fail
    myModule.email.create; // "me@me.com"
    

    【讨论】:

    • 所以,如果 create 是一个函数,而你这样做 email.create() 我猜这个函数会起作用,但是你失去了从该对象实际创建对象的能力。
    • 最佳答案。感谢大家提出这个问题。
    【解决方案4】:

    您知道当您在 JavaScript(在浏览器中)创建全局变量或方法时,它们会成为窗口对象的属性。

    如果您有充分的理由,引入甚至更改方法定义绝对没问题。当然,如果您更改方法行为,可能会出现问题。这是一个示例 - 我覆盖了窗口的打开方法。

    <html lang="en">
    <head>
    <script>
    function windowOpen() {
    window.open("http://www.google.com")
    }
    
    function windoOpenChange() {
    window.open = function () {
    alert("I won't open the window!");
    };
    }
    </script>
    </head>
    <body>
    <button value="open window" onClick="windowOpen()">Go to Google</button>
    <button value="open window" onClick="windoOpenChange()">Change the behavior of window open</button>
    </body>
    </html>
    

    这是在 FF 中测试的。因此,第一次单击会打开一个新窗口,然后当您单击第二个按钮时,window.open 的行为会发生变化。现在,当您再次单击第一个按钮时,它将不再打开新窗口。所以是的,如果这不是您打算做的,这可能会被视为不良副作用。

    能够从其他对象引入新方法的能力称为Mixin。当然,根据您的 mixin 逻辑,任何 mixin 都可能遇到冲突,而不仅仅是内置对象。

    您使用的工具会警告您注意方法的潜在阴影(不需要的覆盖)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-14
      • 2012-06-18
      • 2011-08-12
      • 2011-11-30
      • 2011-12-22
      • 2010-11-24
      相关资源
      最近更新 更多