我刚注意到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) {};
这是否可能导致一个模糊的问题?我猜这个保留方法不适用于文字,或者没有用默认构造函数实例化的对象。好奇。
答案 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)
答案 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都可能遇到冲突而不仅仅是内置于对象中。
您正在使用的工具警告您不要使用潜在的阴影(不必要的覆盖)方法。