airnb/javascript:这是什么意思;这些方法可能会被属性隐藏;?

airnb/javascript:这是什么意思;这些方法可能会被属性隐藏;?,javascript,Javascript,我试图在github airnb/javascript上理解以下句子 为什么??这些方法可能会被中对象的属性遮挡 问题: 在这种情况下,“阴影”是什么意思 为便于参考,请参阅完整部分: 3.7不要直接调用Object.prototype方法,例如hasOwnProperty、propertyIsEnumerable和isPrototypeOf 为什么??这些方法可能会被中对象的属性遮挡 问题考虑{HasObjyt:false },或者,对象可能是 空对象(object.create(null)

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

为什么??这些方法可能会被中对象的属性遮挡 问题:

在这种情况下,“阴影”是什么意思

为便于参考,请参阅完整部分:

3.7不要直接调用Object.prototype方法,例如hasOwnProperty、propertyIsEnumerable和isPrototypeOf

为什么??这些方法可能会被中对象的属性遮挡 问题考虑{HasObjyt:false },或者,对象可能是 空对象(object.create(null))


考虑下面的一些例子:

const object = { hasOwnProperty: false }
console.log(object.hasOwnProperty(key)) // Error: hasOwnProperty is not a function


因此,您可以理解
变浅
在这种情况下,原型中的对象方法被对象属性(具有相同的名称)变浅

考虑以下示例:

const object = { hasOwnProperty: false }
console.log(object.hasOwnProperty(key)) // Error: hasOwnProperty is not a function


因此,您可以理解
变浅
在本例中,原型中的对象方法被对象属性(具有相同的名称)变浅

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

但是当您从
对象.prototype
调用此
方法时,它是该方法的
正确版本
,并将上下文传递给它,它将正常工作,因为它将调用名为
hasOwnProperty
Object.prototype
s方法,并将此对象作为方法的上下文传递。因此,这里有一个警告,您必须使用原型中的这个方法

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

const object={
hasOwnProperty:function(){
返回true;
}
};
console.log(object.hasOwnProperty('name'));

log(Object.prototype.hasOwnProperty.call(Object,'name'))参见示例。在这里,我直接在我的
对象上创建了一个名为
hasOwnProperty
的函数。因此,它隐藏了
hasOwnProperty
的父版本。我在其中编写了一个逻辑,每次
true
都会返回该逻辑。因此,任何使用我的对象并试图检测它是否具有某些属性的人(他/她不知道我已经跟踪了基础),他/她的代码中可能存在逻辑错误。因为JS将首先尝试在对象中找到函数,并调用实际执行其他工作的版本

但是当您从
对象.prototype
调用此
方法时,它是该方法的
正确版本
,并将上下文传递给它,它将正常工作,因为它将调用名为
hasOwnProperty
Object.prototype
s方法,并将此对象作为方法的上下文传递。因此,这里有一个警告,您必须使用原型中的这个方法

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

const object={
hasOwnProperty:function(){
返回true;
}
};
console.log(object.hasOwnProperty('name'));

log(Object.prototype.hasOwnProperty.call(Object,'name'))

const anObject={}

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

Shadowed表示在创建的对象中定义的方法或属性与原型链中定义的那些函数或属性具有相同的名称

阴影的示例:

const obj = {};
obj.hasOwnProperty // => ƒ hasOwnProperty() { [native code] }

obj.hasOwnProperty = 'don\'t do this!';
obj.hasOwnProperty // => "don't do this!"

创建对象时

const anObject={}

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

Shadowed表示在创建的对象中定义的方法或属性与原型链中定义的那些函数或属性具有相同的名称

阴影的示例:

const obj = {};
obj.hasOwnProperty // => ƒ hasOwnProperty() { [native code] }

obj.hasOwnProperty = 'don\'t do this!';
obj.hasOwnProperty // => "don't do this!"

好的,在这个上下文中“shadowed”意味着该方法可能已经被“重写”(使用其他面向对象编程语言)。我知道该对象可能为null,但该对象有多大可能具有函数
hasOwnProperty()
被“阴影化”。这是一种常见的情况吗?这是一种常见的情况。您可能使用方法创建对象,但不知道您的方法名称与原型的名称相同。那么null呢,它意味着对象没有原型和它的方法。如果你调用这个方法(你的obj现在没有任何原型),你可以有一个运行时错误OK“shadowed”在这个上下文中意味着这个方法可能已经被“重写”(使用其他面向对象编程语言)。我知道该对象可能为null,但该对象有多大可能具有函数
hasOwnProperty()
被“阴影化”。这是一种常见的情况吗?这是一种常见的情况。您可能使用方法创建对象,但不知道您的方法名称与原型的名称相同。那么null呢,它意味着对象没有原型和它的方法。如果您调用该方法(您的obj现在没有任何原型)