乐趣区

关于javascript:ObjecthasOwn-替换掉-ObjectprototypehasOwnProperty

2021 年 6 月 25 日公布 · 标记为 ECMAScript

倡议应用 Object.hasOwn() 办法,因为它使得 Object.prototype.hasOwnProperty() 更易于应用。

阶段

目前这个提案还在第三阶段

Object.hasOwn 提案为什么会呈现呢?

目前,这样的代码是很常见:

const hasOwnProperty = Object.prototype.hasOwnProperty;

if (hasOwnProperty.call(object, 'foo')) {// `object` has property `foo`.}

或者有些库使得应用 Object.prototype.hasOwnProperty 更简略:
npm: has
npm: lodash.has
See Related

应用 Object.hasOwn 这个新函数,咱们能够将上边代码简写为:

if (Object.hasOwn(object, 'foo')) {// `object` has property `foo`.}

在日常开发中,有某些常见的用法,使得 Object.prototype 上的办法有时可能不可用或是会被从新定义了。

比方:

1. Object.create(null):

Object.create(null) 会创立一个不从 Object.prototype 继承的对象,这使得 Object.prototype 上的办法无法访问。

Object.create(null).hasOwnProperty("foo")
// Uncaught TypeError: Object.create(...).hasOwnProperty is not a function

2. 从新定义 hasOwnProperty:

如果你对对象的内置属性进行了从新赋值改写,那么你在调用某个属性(比方:.hasOwnProperty)时,必定调用的不是对象的内置属性

let object = {hasOwnProperty() {throw new Error("gotcha!")
  }
}

object.hasOwnProperty("foo")
// Uncaught Error: gotcha!

3. ESLint no-prototype-builtins

在 ESLint 的规定 built-in rule 中,是禁止间接应用 Object.prototypes 内置函数

ESLint 文档中对于 no-prototype-builtins 阐明:

对这一规定的谬误例子:

/*eslint no-prototype-builtins: "error"*/
var hasBarProperty = foo.hasOwnProperty("bar");
...

对这一规定的正确例子:

/*eslint no-prototype-builtins: "error"*/
var hasBarProperty = Object.prototype.hasOwnProperty.call(foo, "bar");
...

提案

该提案增加了一个 Object.hasOwn(object, property) 办法,其行为与调用 hasOwnProperty.call(object, property) 雷同

let object = {foo: false}
Object.hasOwn(object, "foo") // true

let object2 = Object.create({foo: true})
Object.hasOwn(object2, "foo") // false

let object3 = Object.create(null)
Object.hasOwn(object3, "foo") // false

为什么不是 应用 Object.hasOwnProperty(object, property)?

Object.hasOwnProperty(property) 明天曾经存在,因为 Object 自身继承自 Object.prototype,所以定义一个具备不同名称的新办法将是一个比拟显著的变动。

为什么命名为 hasOwn 呢?

See Issue #3

Object.hasOwn 曾经在 V8 v9.3 中,执行时在后边加上 –harmony-object-has-own 的标记就能够应用,Chrome 中不久之后也会推出它。

参考

  • Accessible Object.prototype.hasOwnProperty()
退出移动版