# prefer-reflect

此规则在 ESLint v3.9.0 中已弃用,不会被替换。这条规则的初衷现在似乎被误导了,因为我们已经了解到 Reflect 方法实际上并不是要替换规则建议的 Object 对应物,而是作为低级原语存在,与代理一起使用以复制默认值各种先前存在的功能的行为。

请注意:此规则包含不正确的行为 - 它会建议您使用 Reflect.getOwnPropertyNames 而不是 Object.getOwnPropertyNames,但前一个在 规范 中不存在。我们建议将 exceptions 选项与 "getOwnPropertyNames" 一起使用,以避免这种错误建议。

ES6 Reflect API 附带了一些方法,它们在一定程度上弃用了旧构造函数的方法:

  • Reflect.apply 有效地弃用了 Function.prototype.applyFunction.prototype.call
  • Reflect.deleteProperty 有效地弃用了 delete 关键字
  • Reflect.getOwnPropertyDescriptor 有效地弃用了 Object.getOwnPropertyDescriptor
  • Reflect.getPrototypeOf 有效地弃用了 Object.getPrototypeOf
  • Reflect.setPrototypeOf 有效地弃用了 Object.setPrototypeOf
  • Reflect.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()

无例外地使用此规则的错误代码示例:

/*eslint prefer-reflect: "error"*/

myFunction.apply(undefined, args);
myFunction.apply(null, args);
obj.myMethod.apply(obj, args);
obj.myMethod.apply(other, args);

myFunction.call(undefined, arg);
myFunction.call(null, arg);
obj.myMethod.call(obj, arg);
obj.myMethod.call(other, arg);

无例外地使用此规则的正确代码示例:

/*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()

无例外地使用此规则的错误代码示例:

/*eslint prefer-reflect: "error"*/

Object.defineProperty({}, 'foo', {value: 1})

无例外地使用此规则的正确代码示例:

/*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()

无例外地使用此规则的错误代码示例:

/*eslint prefer-reflect: "error"*/

Object.getOwnPropertyDescriptor({}, 'foo')

无例外地使用此规则的正确代码示例:

/*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()

无例外地使用此规则的错误代码示例:

/*eslint prefer-reflect: "error"*/

Object.getPrototypeOf({}, 'foo')

无例外地使用此规则的正确代码示例:

/*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()

无例外地使用此规则的错误代码示例:

/*eslint prefer-reflect: "error"*/

Object.setPrototypeOf({}, Object.prototype)

无例外地使用此规则的正确代码示例:

/*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

无例外地使用此规则的错误代码示例:

/*eslint prefer-reflect: "error"*/

Object.isExtensible({})

无例外地使用此规则的正确代码示例:

/*eslint prefer-reflect: "error"*/

Reflect.isExtensible({})

此规则使用 { "exceptions": ["isExtensible"] } 选项的正确代码示例:

/*eslint prefer-reflect: ["error", { "exceptions": ["isExtensible"] }]*/

Object.isExtensible({})
Reflect.isExtensible({})

# Reflect.preventExtensions

弃用 Object.preventExtensions()

无例外地使用此规则的错误代码示例:

/*eslint prefer-reflect: "error"*/

Object.preventExtensions({})

无例外地使用此规则的正确代码示例:

/*eslint prefer-reflect: "error"*/

Reflect.preventExtensions({})

此规则使用 { "exceptions": ["preventExtensions"] } 选项的正确代码示例:

/*eslint prefer-reflect: ["error", { "exceptions": ["preventExtensions"] }]*/

Object.preventExtensions({})
Reflect.preventExtensions({})

# Reflect.deleteProperty

弃用 delete 关键字

无例外地使用此规则的错误代码示例:

/*eslint prefer-reflect: "error"*/

delete foo.bar; // deleting object property

无例外地使用此规则的正确代码示例:

/*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 的地方,您可以安全地禁用此规则。

Last Updated: 5/13/2023, 8:55:38 PM