我尝试在github airnb / javascript
中理解以下句子https://github.com/airbnb/javascript#objects--prototype-builtins
为什么呢?这些方法可能被对象中的属性遮蔽 问题
在这种情况下,“阴影”是什么意思?
为了便于参考,请参阅完整部分:
3.7不要直接调用Object.prototype方法,例如hasOwnProperty,propertyIsEnumerable和isPrototypeOf。
为什么呢?这些方法可能被对象中的属性遮蔽 问题 - 考虑{hasOwnProperty:false} - 或者,对象可能是 一个null对象(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));
答案 0 :(得分:2)
考虑以下一些例子:
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
在这种情况下,你的对象原型中的方法被对象属性浅化(具有相同的名称)
答案 1 :(得分:2)
查看示例。在这里,我直接在我的hasOwnProperty
上创建了一个名为object
的函数。所以它隐藏了hasOwnProperty
的父版本。在其中我写了一个逻辑,每次true
都会返回。所以任何人都会使用我的对象并试图检测它是否有一些属性(他/她不知道我已经隐藏了基础)他可能在他/她的代码中有逻辑错误。因为JS会尝试在对象中首先找到该函数,并调用该实际执行另一项工作的版本。
但是当你从方法的method
Object.prototype
调用此correct version
并将上下文传递给它时,它会正常工作,因为它会调用名为Object.prototype
的{{1}}方法,只需将此对象作为方法的上下文传递。所以从这里开始警告你必须从原型中使用这些方法。
实际上您也可以更改方法的hasOwnProperty
版本,但有一条规则,不更改内置对象的原型。
Object.prototype
第一个const object = {
hasOwnProperty: function() {
return true;
}
};
console.log(object.hasOwnProperty('name'));
console.log(Object.prototype.hasOwnProperty.call(object, 'name'));
表示log
中有一个属性name
,但事实并非如此。这可能会导致逻辑错误。第二个使用正确的版本并给出正确的结果。
答案 2 :(得分:2)
创建对象时
const anObject = {};
它几乎总是在原型链中有Object
。它允许创建的对象访问Object
中定义的函数,如hasOwnProperty
。
阴影表示在创建的对象中定义的方法或属性与原型链中的那些函数或属性具有相同的名称。
阴影示例:
const obj = {};
obj.hasOwnProperty // => ƒ hasOwnProperty() { [native code] }
obj.hasOwnProperty = 'don\'t do this!';
obj.hasOwnProperty // => "don't do this!"