首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >airnb/javascript:这是什么意思:“这些方法可能被属性所遮蔽.”?

airnb/javascript:这是什么意思:“这些方法可能被属性所遮蔽.”?
EN

Stack Overflow用户
提问于 2017-09-26 06:28:12
回答 3查看 132关注 0票数 1

我试着在github airnb/javascript上理解以下句子

https://github.com/airbnb/javascript#objects--prototype-builtins

为什么?这些方法可能被有关对象的属性所遮蔽。

在这种情况下,“阴影”意味着什么?

为了在这里更方便地参考,请参阅全文:

3.7不要直接调用Object.prototype方法,例如hasOwnProperty、propertyIsEnumerable和isPrototypeOf。 为什么?这些方法可能被有关对象上的属性所遮蔽--考虑{ hasOwnProperty: false }--或者,对象可能是空对象(Object.create( null ))。

代码语言:javascript
运行
复制
// bad
console.log(object.hasOwnProperty(key));

// good 
console.log(Object.prototype.hasOwnProperty.call(object,key));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope. 
/* or */ 
import has from 'has'; 
// ...
console.log(has.call(object, key));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-26 06:40:17

当您创建对象时

const anObject = {};

它几乎总是在原型链中有Object。它允许创建的对象能够访问在Object中定义的函数,如hasOwnProperty

阴影是指在创建的对象中定义的方法或属性与原型链中的函数或属性具有相同的名称。

阴影的例子:

代码语言:javascript
运行
复制
const obj = {};
obj.hasOwnProperty // => ƒ hasOwnProperty() { [native code] }

obj.hasOwnProperty = 'don\'t do this!';
obj.hasOwnProperty // => "don't do this!"
票数 2
EN

Stack Overflow用户

发布于 2017-09-26 06:32:05

考虑下面的一些例子:

代码语言:javascript
运行
复制
const object = { hasOwnProperty: false }
console.log(object.hasOwnProperty(key)) // Error: hasOwnProperty is not a function

代码语言:javascript
运行
复制
const object = null
console.log(object.hasOwnProperty(key)) // Error: Can not read property of null

因此,您可以理解shallowed在本例中是原型中的对象方法被对象属性(具有相同的名称)所剪切。

票数 2
EN

Stack Overflow用户

发布于 2017-09-26 06:34:11

看一个例子。在这里,我直接在我的hasOwnProperty上创建了一个名为object的函数。因此,它隐藏了hasOwnProperty的父版本。在它中,我编写了一个逻辑,它每次都会返回true。因此,任何使用我的对象并试图检测它中是否有某些属性的人(他/她不知道我在其中隐藏了基础),他/她的代码中就有一个逻辑错误。因为JS将尝试首先在对象中找到函数,并调用该版本,这实际上是在执行另一项工作。

但是,当您从method (方法的correct version )调用这个correct version并将上下文传递给它时,它将正确工作,因为它将用名称hasOwnProperty调用Object.prototype的方法,并将这个对象作为方法的上下文传递。从这里开始,警告您必须使用原型中的这些方法。

实际上,您也可以更改方法的Object.prototype版本,但有一条规则,即不更改内置对象的原型。

代码语言:javascript
运行
复制
const object = { 
  hasOwnProperty: function() {
      return true;
  }
};

console.log(object.hasOwnProperty('name')); 
console.log(Object.prototype.hasOwnProperty.call(object, 'name'));

第一个logobject中有一个属性name,但它不是,这可能会导致逻辑错误。第二个版本使用正确的版本,并给出了正确的结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46419263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档