prefer-reflect
在适用的情况下要求使用 Reflect 方法
此规则的最初意图现在看来是误导性的,因为我们已经了解到 Reflect 方法实际上并非旨在取代规则建议的 Object 对等方法,而是作为底层原语存在,与代理一起使用,以便复制先前存在的各种功能的默认行为。
请注意:此规则包含不正确的行为 - 它会建议您使用 Reflect.getOwnPropertyNames 而不是 Object.getOwnPropertyNames,但前者在 规范中不存在。我们建议使用带有 "getOwnPropertyNames" 的 exceptions 选项以避免此错误建议。
ES6 Reflect API 附带了一些方法,这些方法在某种程度上弃用了旧构造器上的方法
Reflect.apply有效地弃用了Function.prototype.apply和Function.prototype.callReflect.deleteProperty有效地弃用了delete关键字Reflect.getOwnPropertyDescriptor有效地弃用了Object.getOwnPropertyDescriptorReflect.getPrototypeOf有效地弃用了Object.getPrototypeOfReflect.setPrototypeOf有效地弃用了Object.setPrototypeOfReflect.preventExtensions有效地弃用了Object.preventExtensions
prefer-reflect 规则将标记任何旧方法的使用,建议改为使用较新的 Reflect 版本。
规则详情
选项
例外
"prefer-reflect": [<enabled>, { "exceptions": [<...exceptions>] }]
exceptions 选项允许您传递一个方法名称数组,您希望继续以旧样式使用这些方法。
例如,如果您希望使用所有 Reflect 方法,但 Function.prototype.apply 除外,那么您的配置将如下所示:prefer-reflect: [2, { "exceptions": ["apply"] }]。
如果您想使用 Reflect 方法,但继续使用 delete 关键字,那么您的配置将如下所示:prefer-reflect: [2, { "exceptions": ["delete"] }]。
这些可以根据您的喜好进行组合。要使所有方法都成为例外(从而使此规则无用),请使用 prefer-reflect: [2, { "exceptions": ["apply", "call", "defineProperty", "getOwnPropertyDescriptor", "getPrototypeOf", "setPrototypeOf", "isExtensible", "getOwnPropertyNames", "preventExtensions", "delete"] }]
Reflect.apply
弃用 Function.prototype.apply() 和 Function.prototype.call()
未使用 exceptions 时,此规则的 错误 代码示例
/*eslint prefer-reflect: "error"*/
;
;
;
;
;
;
;
;
未使用 exceptions 时,此规则的 正确 代码示例
/*eslint prefer-reflect: "error"*/
Reflect.apply(myFunction, undefined, args);
Reflect.apply(myFunction, null, args);
Reflect.apply(obj.myMethod, obj, args);
Reflect.apply(obj.myMethod, other, args);
Reflect.apply(myFunction, undefined, [arg]);
Reflect.apply(myFunction, null, [arg]);
Reflect.apply(obj.myMethod, obj, [arg]);
Reflect.apply(obj.myMethod, other, [arg]);
使用 { "exceptions": ["apply"] } 选项时,此规则的 正确 代码示例
/*eslint prefer-reflect: ["error", { "exceptions": ["apply"] }]*/
// in addition to Reflect.apply(...):
myFunction.apply(undefined, args);
myFunction.apply(null, args);
obj.myMethod.apply(obj, args);
obj.myMethod.apply(other, args);
使用 { "exceptions": ["call"] } 选项时,此规则的 正确 代码示例
/*eslint prefer-reflect: ["error", { "exceptions": ["call"] }]*/
// in addition to Reflect.apply(...):
myFunction.call(undefined, arg);
myFunction.call(null, arg);
obj.myMethod.call(obj, arg);
obj.myMethod.call(other, arg);
Reflect.defineProperty
弃用 Object.defineProperty()
未使用 exceptions 时,此规则的 错误 代码示例
/*eslint prefer-reflect: "error"*/
未使用 exceptions 时,此规则的 正确 代码示例
/*eslint prefer-reflect: "error"*/
Reflect.defineProperty({}, 'foo', {value: 1})
使用 { "exceptions": ["defineProperty"] } 选项时,此规则的 正确 代码示例
/*eslint prefer-reflect: ["error", { "exceptions": ["defineProperty"] }]*/
Object.defineProperty({}, 'foo', {value: 1})
Reflect.defineProperty({}, 'foo', {value: 1})
Reflect.getOwnPropertyDescriptor
弃用 Object.getOwnPropertyDescriptor()
未使用 exceptions 时,此规则的 错误 代码示例
/*eslint prefer-reflect: "error"*/
未使用 exceptions 时,此规则的 正确 代码示例
/*eslint prefer-reflect: "error"*/
Reflect.getOwnPropertyDescriptor({}, 'foo')
使用 { "exceptions": ["getOwnPropertyDescriptor"] } 选项时,此规则的 正确 代码示例
/*eslint prefer-reflect: ["error", { "exceptions": ["getOwnPropertyDescriptor"] }]*/
Object.getOwnPropertyDescriptor({}, 'foo')
Reflect.getOwnPropertyDescriptor({}, 'foo')
Reflect.getPrototypeOf
弃用 Object.getPrototypeOf()
未使用 exceptions 时,此规则的 错误 代码示例
/*eslint prefer-reflect: "error"*/
未使用 exceptions 时,此规则的 正确 代码示例
/*eslint prefer-reflect: "error"*/
Reflect.getPrototypeOf({}, 'foo')
使用 { "exceptions": ["getPrototypeOf"] } 选项时,此规则的 正确 代码示例
/*eslint prefer-reflect: ["error", { "exceptions": ["getPrototypeOf"] }]*/
Object.getPrototypeOf({}, 'foo')
Reflect.getPrototypeOf({}, 'foo')
Reflect.setPrototypeOf
弃用 Object.setPrototypeOf()
未使用 exceptions 时,此规则的 错误 代码示例
/*eslint prefer-reflect: "error"*/
未使用 exceptions 时,此规则的 正确 代码示例
/*eslint prefer-reflect: "error"*/
Reflect.setPrototypeOf({}, Object.prototype)
使用 { "exceptions": ["setPrototypeOf"] } 选项时,此规则的 正确 代码示例
/*eslint prefer-reflect: ["error", { "exceptions": ["setPrototypeOf"] }]*/
Object.setPrototypeOf({}, Object.prototype)
Reflect.setPrototypeOf({}, Object.prototype)
Reflect.isExtensible
弃用 Object.isExtensible
未使用 exceptions 时,此规则的 错误 代码示例
/*eslint prefer-reflect: "error"*/
未使用 exceptions 时,此规则的 正确 代码示例
/*eslint prefer-reflect: "error"*/
Reflect.isExtensible({})
使用 { "exceptions": ["isExtensible"] } 选项时,此规则的 正确 代码示例
/*eslint prefer-reflect: ["error", { "exceptions": ["isExtensible"] }]*/
Object.isExtensible({})
Reflect.isExtensible({})
Reflect.preventExtensions
弃用 Object.preventExtensions()
未使用 exceptions 时,此规则的 错误 代码示例
/*eslint prefer-reflect: "error"*/
未使用 exceptions 时,此规则的 正确 代码示例
/*eslint prefer-reflect: "error"*/
Reflect.preventExtensions({})
使用 { "exceptions": ["preventExtensions"] } 选项时,此规则的 正确 代码示例
/*eslint prefer-reflect: ["error", { "exceptions": ["preventExtensions"] }]*/
Object.preventExtensions({})
Reflect.preventExtensions({})
Reflect.deleteProperty
弃用 delete 关键字
未使用 exceptions 时,此规则的 错误 代码示例
/*eslint prefer-reflect: "error"*/
; // deleting object property
未使用 exceptions 时,此规则的 正确 代码示例
/*eslint prefer-reflect: "error"*/
delete bar; // deleting variable
Reflect.deleteProperty(foo, 'bar');
注意:有关阻止删除变量的规则,请参阅 no-delete-var
使用 { "exceptions": ["delete"] } 选项时,此规则的 正确 代码示例
/*eslint prefer-reflect: ["error", { "exceptions": ["delete"] }]*/
delete bar
delete foo.bar
Reflect.deleteProperty(foo, 'bar');
何时不使用它
此规则不应在 ES3/5 环境中使用。
在 ES2015 (ES6) 或更高版本中,如果您不想收到有关可以使用 Reflect 的位置的通知,您可以安全地禁用此规则。
相关规则
版本
此规则在 ESLint v1.0.0-rc-2 中引入。