是否可以使用"创建"作为JavaScript对象文字中的属性名称?

时间:2015-03-31 23:40:10

标签: javascript intellij-idea jshint ecmascript-5

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

字面意思是:

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

并且(很明显?)Object有一个在EcmaScript5.js中定义的create方法

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

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

4 个答案:

答案 0 :(得分:1)

现有答案是正确的,但缺少一些重要细节。你正在做的事情绝对没问题,不会在任何JavaScript环境中造成错误。

多次提及的Object.create method 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
};

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

答案 1 :(得分:0)

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

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

只需为您的方法使用其他名称。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

如果您有充分的理由,引入甚至更改方法定义是绝对正确的。当然,如果更改方法行为,有些事情可能会出错。这是一个例子 - 我覆盖了窗口的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都可能遇到冲突而不仅仅是内置于对象中。

您正在使用的工具警告您不要使用潜在的阴影(不必要的覆盖)方法。