可以在 JavaScript 对象文字中使用 "create" 作为 属性 名称吗?
Is it okay to use "create" as a property name in a JavaScript object literal?
我刚刚注意到 IDEA / JSHint 告诉我一个包含 属性 名为 "create" 的对象文字覆盖了 Object.
中的一个方法
文字本质上是:
module.exports = {email:{create:"me@me.com"}};
并且(显然?)对象有一个在 EcmaScript5.js
中定义的创建方法
/**
@param {Object} proto
@param {Object} [props]
@static
@return {Object}
*/
Object.create = function(proto,props) {};
这是否会导致后续出现难以理解的问题?我猜这个保留方法不适用于文字或未使用默认构造函数实例化的对象。只是好奇。
它是 not reserved,但它 正在使用 (已定义)在 Object
对象上。
由于文字对象也成为对象,因此自定义 create() 方法将覆盖现有方法。
只需为您的方法使用不同的名称即可。
它不是保留的,它是一个有效的标识符,但是,正如您所说,您正在覆盖文字上的 Object create 方法。
它只会影响你是否尝试在你的文字上使用创建。
myModule.email.create(); // Will fail
myModule.email.create; // "me@me.com"
请注意,当您在 JavaScript(在浏览器中)中创建全局变量或方法时,它们将成为 window 对象的属性。
如果您有充分的理由,引入甚至更改方法定义绝对没问题。当然,如果您更改方法行为,有些事情可能会出错。这是一个示例 - 我覆盖了 window 的打开方法。
<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,然后当您单击第二个按钮时,window.open 的行为会发生变化。现在,当您再次单击第一个按钮时,它将不再打开新的 window。所以是的,如果这不是您打算做的,这可能被视为不良副作用。
能够从其他对象中引入新方法的能力被称为Mixin。当然,根据您的混入逻辑,任何混入都可能 运行 发生冲突,而不仅仅是内置对象。
您正在使用的工具警告您不要对方法进行潜在的隐藏(不需要的覆盖)。
现有答案是正确的,但缺少一些重要的细节。您所做的绝对没问题,不会在任何 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
};
总而言之,您可以安全地忽略该警告,并且不必担心您的代码可能产生的任何潜在副作用。
我刚刚注意到 IDEA / JSHint 告诉我一个包含 属性 名为 "create" 的对象文字覆盖了 Object.
中的一个方法文字本质上是:
module.exports = {email:{create:"me@me.com"}};
并且(显然?)对象有一个在 EcmaScript5.js
中定义的创建方法/**
@param {Object} proto
@param {Object} [props]
@static
@return {Object}
*/
Object.create = function(proto,props) {};
这是否会导致后续出现难以理解的问题?我猜这个保留方法不适用于文字或未使用默认构造函数实例化的对象。只是好奇。
它是 not reserved,但它 正在使用 (已定义)在 Object
对象上。
由于文字对象也成为对象,因此自定义 create() 方法将覆盖现有方法。
只需为您的方法使用不同的名称即可。
它不是保留的,它是一个有效的标识符,但是,正如您所说,您正在覆盖文字上的 Object create 方法。 它只会影响你是否尝试在你的文字上使用创建。
myModule.email.create(); // Will fail
myModule.email.create; // "me@me.com"
请注意,当您在 JavaScript(在浏览器中)中创建全局变量或方法时,它们将成为 window 对象的属性。
如果您有充分的理由,引入甚至更改方法定义绝对没问题。当然,如果您更改方法行为,有些事情可能会出错。这是一个示例 - 我覆盖了 window 的打开方法。
<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,然后当您单击第二个按钮时,window.open 的行为会发生变化。现在,当您再次单击第一个按钮时,它将不再打开新的 window。所以是的,如果这不是您打算做的,这可能被视为不良副作用。
能够从其他对象中引入新方法的能力被称为Mixin。当然,根据您的混入逻辑,任何混入都可能 运行 发生冲突,而不仅仅是内置对象。
您正在使用的工具警告您不要对方法进行潜在的隐藏(不需要的覆盖)。
现有答案是正确的,但缺少一些重要的细节。您所做的绝对没问题,不会在任何 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
};
总而言之,您可以安全地忽略该警告,并且不必担心您的代码可能产生的任何潜在副作用。