Javascript hasOwnProperty正在遍历原型链

Javascript hasOwnProperty正在遍历原型链,javascript,Javascript,今天我注意到hasOwnProperty方法的一些奇怪行为 我所处的环境完全支持ES6类,因此无需担心任何透明性 上面的代码段应该分别返回true和false,但它同时返回true和false 类内容{ 构造函数(){this.something='something';} } 类MoreStuff扩展了Stuff{} const stuff=新内容(); const moreStuff=新的moreStuff(); log(Object.prototype.hasOwnProperty.ca

今天我注意到
hasOwnProperty
方法的一些奇怪行为

我所处的环境完全支持ES6类,因此无需担心任何透明性

上面的代码段应该分别返回true和false,但它同时返回true和false

类内容{
构造函数(){this.something='something';}
}
类MoreStuff扩展了Stuff{}
const stuff=新内容();
const moreStuff=新的moreStuff();
log(Object.prototype.hasOwnProperty.call(stuff'something');

log(Object.prototype.hasOwnProperty.call(moreStuff,'something')构造函数将“something”属性直接放在构造的对象上。无论是创建父类的实例还是继承类的实例,这都是正确的。原型链不涉及。

当您在contsructor中执行以下操作时:

this.something = 'something';
您将该值放入对象中,而不是原型中

即使是子类化,构造函数也会将
'something'
的值添加到对象中

如果要在原型上使用,则必须将其设置为静态:

类内容{
静态获取某物(){
返回“某物”;
}
构造函数(){
this.ownProp=true;
}
}
Stuff.somethingElse='somethingElse';
类MoreStuff扩展了Stuff{}
const stuff=新内容();
const moreStuff=新的moreStuff();
console.log(stuff.hasOwnProperty('something'));
log(stuff.hasOwnProperty('somethingElse');
log(stuff.hasOwnProperty('ownProp');
log(moreStuff.hasOwnProperty('something');
log(moreStuff.hasOwnProperty('somethingElse');

log(moreStuff.hasOwnProperty('ownProp')为什么要使用
呼叫
Object.prototype.hasOwnProperty
通常在类上调用,而不是在实例上调用。@evolutionxbox否,向后;它是在实例上调用的,如
stuff.hasOwnProperty(“something”)
@Pointy感谢您的澄清。是否有任何情况下您会将
调用
hasOwnProperty
一起使用?好吧,我想不出有什么理由这么做。我不能肯定地说它永远不会有意义,但一般情况下,这种情况涉及对象引用,因此直接使用它同样容易。有几种情况下,你不能依赖对象使用这种方法
Object.create(null)
undefined
null
都是直接调用该方法时会抛出的示例。因此,无法向只属于每个实例的类添加普通的“属性”。在构造函数上添加的所有内容都是实例属性。只对方法有效。我不是很担心,但知道这一点很好。作为原型继承的超级粉丝,很遗憾我自己没有弄明白这一点。如果你将你的属性作为类的一部分(静态值),那么它对类的所有实例都是可用的。对不起,我不清楚。我的意思是,在一个类的实例上,没有办法使一个属性成为
ownProperty
,但在扩展类上却不是自己的属性。静态属性总是属于原型,而不是实例,老实说,这是有道理的。对不起,我误解了。是的,你说得对。它在实例上是
ownProperty
,在类定义上是
ownProperty
。如果类有一个static,那么它可以是,然后您也在实例上设置了一个值,但我怀疑这是您想要的。