PublishedJun25,2021·TaggedECMAScript推荐使用Object.hasOwn()方法,因为它使Object.prototype.hasOwnProperty()更易于使用。Stage目前这个提案还处于第三阶段为什么会出现Object.hasOwn提案?目前,这样的代码很常见:consthasOwnProperty=Object.prototype.hasOwnProperty;if(hasOwnProperty.call(object,'foo')){//`object`具有属性`foo`。}或者一些库使得使用Object.prototype.hasOwnProperty更简单:npm:hasnpm:lodash.has参见相关使用新函数Object.hasOwn,我们可以将上面的代码简写为:if(Object.hasOwn(object,'foo')){//`object`有属性`foo`。}这有时会使Object.prototype上的方法不可用或重新定义。例如:1.Object.create(null):Object.create(null)会创建一个不继承自Object.prototype的对象,这使得Object.prototype上的方法不可访问。Object.create(null).hasOwnProperty("foo")//未捕获类型错误:Object.create(...).hasOwnProperty不是函数2。重定义hasOwnProperty:如果对对象的内置属性进行重新赋值和重写,那么在调用某个属性(例如:.hasOwnProperty)时,一定不能调用对象的内置属性letobject={hasOwnProperty(){thrownewError("gotcha!")}}object.hasOwnProperty("foo")//未捕获的错误:gotcha!3.ESLintno-prototype-builtins在ESLint的内置规则中,禁止直接使用Object。错误示例:/*eslintno-prototype-builtins:"error"*/varhasBarProperty=foo.hasOwnProperty("bar");...此规则的正确示例:/*eslintno-prototype-builtins:"error"*/varhasBarProperty=Object.prototype.hasOwnProperty.call(foo,"bar");...提案该提案添加了一个Object.hasOwn(object,property)方法,其行为与调用hasOwnProperty.call(object,property)与letobject={foo:false}Object.hasOwn(object,"foo")//trueletobject2=Object.create({foo:true})Object.hasOwn(object2,"foo")//falselet相同object3=Object.create(null)Object.hasOwn(object3,"foo")//false为什么不使用Object.hasOwnProperty(object,property)?Object.hasOwnProperty(property)之所以存在,是因为Object本身继承自Object.prototype,所以定义一个不同名称的新方法会是一个更明显的变化为什么叫hasOwn?参见Issue#3Object.hasOwn已经在V8v9.3中,执行后加上--harmony-object-has-ownflag即可使用,即将在Chrome中上线。请参阅可访问的Object.prototype.hasOwnProperty()
