Suggest using Reflect methods where applicable (prefer-reflect)
The ES6 Reflect API comes with a handful of methods which somewhat deprecate methods on old constructors:
Reflect.apply
effectively deprecatesFunction.prototype.apply
andFunction.prototype.call
Reflect.deleteProperty
effectively deprecates thedelete
keywordReflect.getOwnPropertyDescriptor
effectively deprecatesObject.getOwnPropertyDescriptor
Reflect.getPrototypeOf
effectively deprecatesObject.getPrototypeOf
Reflect.setPrototypeOf
effectively deprecatesObject.setPrototypeOf
Reflect.preventExtensions
effectively deprecatesObject.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 (Function.prototype.apply/Function.prototype.call)
The following patterns are considered problems:
/*eslint prefer-reflect: 2*/
foo.apply(undefined, args); /*error Avoid using Function.prototype.apply, instead use Reflect.apply*/
foo.apply(null, args); /*error Avoid using Function.prototype.apply, instead use Reflect.apply*/
obj.foo.apply(obj, args); /*error Avoid using Function.prototype.apply, instead use Reflect.apply*/
obj.foo.apply(other, args); /*error Avoid using Function.prototype.apply, instead use Reflect.apply*/
foo.call(undefined, arg); /*error Avoid using Function.prototype.call, instead use Reflect.apply*/
foo.call(null, arg); /*error Avoid using Function.prototype.call, instead use Reflect.apply*/
obj.foo.call(obj, arg); /*error Avoid using Function.prototype.call, instead use Reflect.apply*/
obj.foo.call(other, arg); /*error Avoid using Function.prototype.call, instead use Reflect.apply*/
The following patterns are not considered problems:
/*eslint prefer-reflect: 2*/
Reflect.apply(undefined, args);
Reflect.apply(null, args);
Reflect.apply(obj.foo, obj, args);
Reflect.apply(obj.foo, other, args);
Reflect.apply(undefined, [arg]);
Reflect.apply(null, [arg]);
Reflect.apply(obj.foo, obj, [arg]);
Reflect.apply(obj.foo, other, [arg]);
/*eslint prefer-reflect: [2, { exceptions: ["apply"] }]*/
foo.apply(undefined, args);
foo.apply(null, args);
obj.foo.apply(obj, args);
obj.foo.apply(other, args);
Reflect.apply(undefined, args);
Reflect.apply(null, args);
Reflect.apply(obj.foo, obj, args);
Reflect.apply(obj.foo, other, args);
/*eslint prefer-reflect: [2, { exceptions: ["call"] }]*/
foo.call(undefined, arg);
foo.call(null, arg);
obj.foo.call(obj, arg);
obj.foo.call(other, arg);
Reflect.apply(undefined, [arg]);
Reflect.apply(null, [arg]);
Reflect.apply(obj.foo, obj, [arg]);
Reflect.apply(obj.foo, other, [arg]);
Reflect.defineProperty (Object.defineProperty)
The following patterns are considered problems:
/*eslint prefer-reflect: 2*/
Object.defineProperty({}, 'foo', {value: 1}) /*error Avoid using Object.defineProperty, instead use Reflect.defineProperty*/
The following patterns are not considered problems:
/*eslint prefer-reflect: 2*/
Reflect.defineProperty({}, 'foo', {value: 1})
/*eslint prefer-reflect: [2, { exceptions: ["defineProperty"] }]*/
Object.defineProperty({}, 'foo', {value: 1})
Reflect.defineProperty({}, 'foo', {value: 1})
Reflect.getOwnPropertyDescriptor (Object.getOwnPropertyDescriptor)
The following patterns are considered problems:
/*eslint prefer-reflect: 2*/
Object.getOwnPropertyDescriptor({}, 'foo') /*error Avoid using Object.getOwnPropertyDescriptor, instead use Reflect.getOwnPropertyDescriptor*/
The following patterns are not considered problems:
/*eslint prefer-reflect: 2*/
Reflect.getOwnPropertyDescriptor({}, 'foo')
config: prefer-reflect: [2, { exceptions: ["getOwnPropertyDescriptor"] }]
/*eslint prefer-reflect: [2, { exceptions: ["getOwnPropertyDescriptor"] }]*/
Object.getOwnPropertyDescriptor({}, 'foo')
Reflect.getOwnPropertyDescriptor({}, 'foo')
Reflect.getPrototypeOf (Object.getPrototypeOf)
The following patterns are considered problems:
/*eslint prefer-reflect: 2*/
Object.getPrototypeOf({}, 'foo') /*error Avoid using Object.getPrototypeOf, instead use Reflect.getPrototypeOf*/
The following patterns are not considered problems:
/*eslint prefer-reflect: 2*/
Reflect.getPrototypeOf({}, 'foo')
/*eslint prefer-reflect: [2, { exceptions: ["getPrototypeOf"] }]*/
Object.getPrototypeOf({}, 'foo')
Reflect.getPrototypeOf({}, 'foo')
Reflect.setPrototypeOf (Object.setPrototypeOf)
The following patterns are considered problems:
/*eslint prefer-reflect: 2*/
Object.setPrototypeOf({}, Object.prototype) /*error Avoid using Object.setPrototypeOf, instead use Reflect.setPrototypeOf*/
The following patterns are not considered problems:
/*eslint prefer-reflect: 2*/
Reflect.setPrototypeOf({}, Object.prototype)
config: prefer-reflect: [2, { exceptions: ["setPrototypeOf"] }]
/*eslint prefer-reflect: [2, { exceptions: ["setPrototypeOf"] }]*/
Object.setPrototypeOf({}, Object.prototype)
Reflect.setPrototypeOf({}, Object.prototype)
Reflect.isExtensible (Object.isExtensible)
The following patterns are considered problems:
/*eslint prefer-reflect: 2*/
Object.isExtensible({}) /*error Avoid using Object.isExtensible, instead use Reflect.isExtensible*/
The following patterns are not considered problems:
/*eslint prefer-reflect: 2*/
Reflect.isExtensible({})
/*eslint prefer-reflect: [2, { exceptions: ["isExtensible"] }]*/
Object.isExtensible({})
Reflect.isExtensible({})
Reflect.getOwnPropertyNames (Object.getOwnPropertyNames)
The following patterns are considered problems:
/*eslint prefer-reflect: 2*/
Object.getOwnPropertyNames({}) /*error Avoid using Object.getOwnPropertyNames, instead use Reflect.getOwnPropertyNames*/
The following patterns are not considered problems:
/*eslint prefer-reflect: 2*/
Reflect.getOwnPropertyNames({})
/*eslint prefer-reflect: [2, { exceptions: ["getOwnPropertyNames"] }]*/
Object.getOwnPropertyNames({})
Reflect.getOwnPropertyNames({})
Reflect.preventExtensions (Object.preventExtensions)
The following patterns are considered problems:
/*eslint prefer-reflect: 2*/
Object.preventExtensions({}) /*error Avoid using Object.preventExtensions, instead use Reflect.preventExtensions*/
The following patterns are not considered problems:
/*eslint prefer-reflect: 2*/
Reflect.preventExtensions({})
/*eslint prefer-reflect: [2, { exceptions: ["preventExtensions"] }]*/
Object.preventExtensions({})
Reflect.preventExtensions({})
Reflect.deleteProperty (The delete
keyword)
The following patterns are considered problems:
/*eslint prefer-reflect: 2*/
delete foo.bar; /*error Avoid using the delete keyword, instead use Reflect.deleteProperty*/
The following patterns are not considered problems:
/*eslint prefer-reflect: 2*/
delete bar; // Does not reference an object, just a var
Reflect.deleteProperty(foo, 'bar');
(Note: For a rule preventing deletion of variables, see no-delete-var instead)
/*eslint prefer-reflect: [2, { 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
Version
This rule was introduced in ESLint 1.0.0-rc-2.