我尝试在github airnb/javascript
上理解以下句子https://github.com/airbnb/javascript#objects-- prototype-builtins
为什么?这些方法可能会被对象上的属性遮蔽 问题
在这种情况下,"阴影"是什么意思?
在此处更轻松地参考:
3.7不要直接调用object.protype方法,例如hasownproperty,propertySenumerable和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));
创建对象
const anObject = {};
它几乎总是在原型链中具有Object
。它允许创建的对象可以访问Object
中定义的函数,例如hasOwnProperty
。
Shadowed 是指在创建对象中定义的方法或属性具有与原型链中的函数或属性相同的名称。
阴影的示例:
const obj = {};
obj.hasOwnProperty // => ƒ hasOwnProperty() { [native code] }
obj.hasOwnProperty = 'don't do this!';
obj.hasOwnProperty // => "don't do this!"
考虑下面的一些示例:
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
是原型中的对象方法,被对象属性(具有相同名称)
请参见一个示例。在这里,我直接在我的object
上创建了一个具有名称hasOwnProperty
的函数。因此,它隐藏了hasOwnProperty
的父版本。在其中,我写了一个逻辑,每次true
都会返回。因此,任何将使用我的对象并试图检测它是否有某些财产的人(他/她不知道我已经遮盖了基地),他/她的代码中都可能存在逻辑错误。因为JS会尝试在对象中首先找到该功能,并调用实际上还有其他工作的版本。
但是,当您从Object.prototype
(即该方法的correct version
)调用此method
并将上下文传递给它时,它将正确工作,因为它将称呼使用名称hasOwnProperty
的Object.prototype
S方法,然后将此对象传递给该对象该方法的上下文。因此,从这里警告您必须使用原型中的这种方法。
实际上,您还可以更改该方法的Object.prototype
版本,但是有一个规则,不要更改内置对象的原型。
const object = {
hasOwnProperty: function() {
return true;
}
};
console.log(object.hasOwnProperty('name'));
console.log(Object.prototype.hasOwnProperty.call(object, 'name'));
第一个log
说object
中有一个属性name
,但不是。这可能会导致逻辑错误。第二个使用正确的版本并给出正确的结果。