可以使用“;创建“;作为JavaScript对象文字中的属性名称

Is it okay to use "create" as a property name in a JavaScript object literal?

本文关键字:属性 文字 JavaScript 创建 作为 可以使 对象      更新时间:2023-09-26

我刚刚注意到IDEA/JSHint告诉我,一个包含名为"create"的属性的对象文字覆盖了object中的一个方法。

字面意思是:

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

而且(显然?)Object有一个在EcmaScript5.js 中定义的创建方法

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

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

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

被多次提及的Object.create方法是static,这意味着它是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
};

总之,您可以安全地忽略警告,也不用担心代码可能产生的任何潜在副作用。

它不是保留的,但它在Object对象上使用(已定义)。

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

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

它不是保留的,它是一个有效的标识符,但正如您所说,您正在重写文本上的Object create方法。只有当您尝试在文字上使用create时,它才会产生影响。

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

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

如果你有充分的理由,引入甚至更改方法定义是完全可以的。当然,如果你更改方法行为,也会出现问题。这里有一个例子——我重写了window的open方法。

<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都可能遇到冲突,而不仅仅是内置对象。

您正在使用的工具警告您不要对方法进行潜在的隐藏(不需要的覆盖)。