我试着在github airnb/javascript上理解以下句子
https://github.com/airbnb/javascript#objects--prototype-builtins
为什么?这些方法可能被有关对象的属性所遮蔽。
在这种情况下,“阴影”意味着什么?
为了在这里更方便地参考,请参阅全文:
3.7不要直接调用Object.prototype方法,例如hasOwnProperty、propertyIsEnumerable和isPrototypeOf。 为什么?这些方法可能被有关对象上的属性所遮蔽--考虑{ hasOwnProperty: false }--或者,对象可能是空对象(Object.create( null ))。
// 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));发布于 2017-09-26 06:40:17
当您创建对象时
const anObject = {};
它几乎总是在原型链中有Object。它允许创建的对象能够访问在Object中定义的函数,如hasOwnProperty。
阴影是指在创建的对象中定义的方法或属性与原型链中的函数或属性具有相同的名称。
阴影的例子:
const obj = {};
obj.hasOwnProperty // => ƒ hasOwnProperty() { [native code] }
obj.hasOwnProperty = 'don\'t do this!';
obj.hasOwnProperty // => "don't do this!"发布于 2017-09-26 06:32:05
考虑下面的一些例子:
const object = { hasOwnProperty: false }
console.log(object.hasOwnProperty(key)) // Error: hasOwnProperty is not a function或
const object = null
console.log(object.hasOwnProperty(key)) // Error: Can not read property of null因此,您可以理解shallowed在本例中是原型中的对象方法被对象属性(具有相同的名称)所剪切。
发布于 2017-09-26 06:34:11
看一个例子。在这里,我直接在我的hasOwnProperty上创建了一个名为object的函数。因此,它隐藏了hasOwnProperty的父版本。在它中,我编写了一个逻辑,它每次都会返回true。因此,任何使用我的对象并试图检测它中是否有某些属性的人(他/她不知道我在其中隐藏了基础),他/她的代码中就有一个逻辑错误。因为JS将尝试首先在对象中找到函数,并调用该版本,这实际上是在执行另一项工作。
但是,当您从method (方法的correct version )调用这个correct version并将上下文传递给它时,它将正确工作,因为它将用名称hasOwnProperty调用Object.prototype的方法,并将这个对象作为方法的上下文传递。从这里开始,警告您必须使用原型中的这些方法。
实际上,您也可以更改方法的Object.prototype版本,但有一条规则,即不更改内置对象的原型。
const object = {
hasOwnProperty: function() {
return true;
}
};
console.log(object.hasOwnProperty('name'));
console.log(Object.prototype.hasOwnProperty.call(object, 'name'));
第一个log说object中有一个属性name,但它不是,这可能会导致逻辑错误。第二个版本使用正确的版本,并给出了正确的结果。
https://stackoverflow.com/questions/46419263
复制相似问题