非常教程

Eslint参考手册

规则 | Rules

prefer-reflect

This rule was deprecated in ESLint v3.9.0 and will not be replaced. The original intent of this rule now seems misguided as we have come to understand that Reflect methods are not actually intended to replace the Object counterparts the rule suggests, but rather exist as low-level primitives to be used with proxies in order to replicate the default behavior of various previously existing functionality.

The ES6 Reflect API comes with a handful of methods which somewhat deprecate methods on old constructors:

  • Reflect.apply effectively deprecates Function.prototype.apply and Function.prototype.call
  • Reflect.deleteProperty effectively deprecates the delete keyword
  • Reflect.getOwnPropertyDescriptor effectively deprecates Object.getOwnPropertyDescriptor
  • Reflect.getPrototypeOf effectively deprecates Object.getPrototypeOf
  • Reflect.setPrototypeOf effectively deprecates Object.setPrototypeOf
  • Reflect.preventExtensions effectively deprecates Object.preventExtensions

The prefer-reflect rule will flag usage of any older method, suggesting to instead use the newer Reflect version.

Rule Details

Options

Exceptions

"prefer-reflect": [<enabled>, { "exceptions": [<...exceptions>] }]

The exceptions option allows you to pass an array of methods names you’d like to continue to use in the old style.

For example if you wish to use all Reflect methods, except for Function.prototype.apply then your config would look like prefer-reflect: [2, { "exceptions": ["apply"] }].

If you want to use Reflect methods, but keep using the delete keyword, then your config would look like prefer-reflect: [2, { "exceptions": ["delete"] }].

These can be combined as much as you like. To make all methods exceptions (thereby rendering this rule useless), use prefer-reflect: [2, { "exceptions": ["apply", "call", "defineProperty", "getOwnPropertyDescriptor", "getPrototypeOf", "setPrototypeOf", "isExtensible", "getOwnPropertyNames", "preventExtensions", "delete"] }]

Reflect.apply

Deprecates Function.prototype.apply() and Function.prototype.call()

Examples of incorrect code for this rule when used without exceptions:

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

Examples of correct code for this rule when used without 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]);

Examples of correct code for this rule with the { "exceptions": ["apply"] } option:

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

Examples of correct code for this rule with the { "exceptions": ["call"] } option:

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

Deprecates Object.defineProperty()

Examples of incorrect code for this rule when used without exceptions:

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

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

Examples of correct code for this rule when used without exceptions:

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

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

Examples of correct code for this rule with the { "exceptions": ["defineProperty"] } option:

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

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

Reflect.getOwnPropertyDescriptor

Deprecates Object.getOwnPropertyDescriptor()

Examples of incorrect code for this rule when used without exceptions:

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

Object.getOwnPropertyDescriptor({}, 'foo')

Examples of correct code for this rule when used without exceptions:

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

Reflect.getOwnPropertyDescriptor({}, 'foo')

Examples of correct code for this rule with the { "exceptions": ["getOwnPropertyDescriptor"] } option:

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

Object.getOwnPropertyDescriptor({}, 'foo')
Reflect.getOwnPropertyDescriptor({}, 'foo')

Reflect.getPrototypeOf

Deprecates Object.getPrototypeOf()

Examples of incorrect code for this rule when used without exceptions:

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

Object.getPrototypeOf({}, 'foo')

Examples of correct code for this rule when used without exceptions:

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

Reflect.getPrototypeOf({}, 'foo')

Examples of correct code for this rule with the { "exceptions": ["getPrototypeOf"] } option:

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

Object.getPrototypeOf({}, 'foo')
Reflect.getPrototypeOf({}, 'foo')

Reflect.setPrototypeOf

Deprecates Object.setPrototypeOf()

Examples of incorrect code for this rule when used without exceptions:

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

Object.setPrototypeOf({}, Object.prototype)

Examples of correct code for this rule when used without exceptions:

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

Reflect.setPrototypeOf({}, Object.prototype)

Examples of correct code for this rule with the { "exceptions": ["setPrototypeOf"] } option:

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

Object.setPrototypeOf({}, Object.prototype)
Reflect.setPrototypeOf({}, Object.prototype)

Reflect.isExtensible

Deprecates Object.isExtensible

Examples of incorrect code for this rule when used without exceptions:

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

Object.isExtensible({})

Examples of correct code for this rule when used without exceptions:

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

Reflect.isExtensible({})

Examples of correct code for this rule with the { "exceptions": ["isExtensible"] } option:

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

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

Reflect.getOwnPropertyNames

Deprecates Object.getOwnPropertyNames()

Examples of incorrect code for this rule when used without exceptions:

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

Object.getOwnPropertyNames({})

Examples of correct code for this rule when used without exceptions:

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

Reflect.getOwnPropertyNames({})

Examples of correct code for this rule with the { "exceptions": ["getOwnPropertyNames"] } option:

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

Object.getOwnPropertyNames({})
Reflect.getOwnPropertyNames({})

Reflect.preventExtensions

Deprecates Object.preventExtensions()

Examples of incorrect code for this rule when used without exceptions:

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

Object.preventExtensions({})

Examples of correct code for this rule when used without exceptions:

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

Reflect.preventExtensions({})

Examples of correct code for this rule with the { "exceptions": ["preventExtensions"] } option:

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

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

Reflect.deleteProperty

Deprecates the delete keyword

Examples of incorrect code for this rule when used without exceptions:

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

delete foo.bar; // deleting object property

Examples of correct code for this rule when used without exceptions:

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

delete bar; // deleting variable
Reflect.deleteProperty(foo, 'bar');

Note: For a rule preventing deletion of variables, see no-delete-var instead

Examples of correct code for this rule with the { "exceptions": ["delete"] } option:

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

delete bar
delete foo.bar
Reflect.deleteProperty(foo, 'bar');

When Not To Use It

This rule should not be used in ES3/5 environments.

In ES2015 (ES6) or later, if you don’t want to be notified about places where Reflect could be used, you can safely disable this rule.

Related Rules

  • no-useless-call
  • prefer-spread
  • no-delete-var

Version

This rule was introduced in ESLint 1.0.0-rc-2.

Resources

  • Rule source
  • Documentation source
 © JS Foundation and other contributors

Licensed under the MIT License.

https://eslint.org/docs/rules/prefer-reflect

规则 | Rules相关

1.accessor-pairs
2.array-bracket-newline
3.array-bracket-spacing
4.array-callback-return
5.array-element-newline
6.arrow-body-style
7.arrow-parens
8.arrow-spacing
9.block-scoped-var
10.block-spacing
11.brace-style
12.callback-return
13.camelcase
14.capitalized-comments
15.class-methods-use-this
16.comma-dangle
17.comma-spacing
18.comma-style
19.complexity
20.computed-property-spacing
21.consistent-return
22.consistent-this
23.constructor-super
24.curly
25.default-case
26.dot-location
27.dot-notation
28.eol-last
29.eqeqeq
30.for-direction
31.func-call-spacing
32.func-name-matching
33.func-names
34.func-style
35.function-paren-newline
36.generator-star
37.generator-star-spacing
38.getter-return
39.global-require
40.global-strict
41.guard-for-in
42.handle-callback-err
43.id-blacklist
44.id-length
45.id-match
46.implicit-arrow-linebreak
47.indent
48.indent-legacy
49.init-declarations
50.jsx-quotes
51.key-spacing
52.keyword-spacing
53.line-comment-position
54.linebreak-style
55.lines-around-comment
56.lines-around-directive
57.lines-between-class-members
58.max-depth
59.max-len
60.max-lines
61.max-nested-callbacks
62.max-params
63.max-statements
64.max-statements-per-line
65.multiline-comment-style
66.multiline-ternary
67.new-cap
68.new-parens
69.newline-after-var
70.newline-before-return
71.newline-per-chained-call
72.no-alert
73.no-array-constructor
74.no-arrow-condition
75.no-await-in-loop
76.no-bitwise
77.no-buffer-constructor
78.no-caller
79.no-case-declarations
80.no-catch-shadow
81.no-class-assign
82.no-comma-dangle
83.no-compare-neg-zero
84.no-cond-assign
85.no-confusing-arrow
86.no-console
87.no-const-assign
88.no-constant-condition
89.no-continue
90.no-control-regex
91.no-debugger
92.no-delete-var
93.no-div-regex
94.no-dupe-args
95.no-dupe-class-members
96.no-dupe-keys
97.no-duplicate-case
98.no-duplicate-imports
99.no-else-return
100.no-empty
Eslint

ESLint 是一个代码规范和错误检查工具,有以下几个特性。所有东西都是可以插拔的。你可以调用任意的 rule api 或者 formatter api 去打包或者定义 rule or formatter。任意的 rule 都是独立的。没有特定的 coding style,你可以自己配置。

主页 https://eslint.org/
源码 https://github.com/eslint/eslint
发布版本 4.12.0

Eslint目录

1.指南 | Guide
2.规则 | Rules