今天我注意到hasOwnProperty
方法有些奇怪的行为。
我在完全支持ES6类的环境中,因此无需担心编译问题。
上面的代码片段应该分别返回true和false,但是两者都返回true。
class Stuff {
constructor() { this.something = 'something'; }
}
class MoreStuff extends Stuff {}
const stuff = new Stuff();
const moreStuff = new MoreStuff();
console.log(Object.prototype.hasOwnProperty.call(stuff, 'something'));
console.log(Object.prototype.hasOwnProperty.call(moreStuff, 'something'));
也许我在这里丢失了一些东西,但是据我所知,东西上存在着某种东西,它是在moreStuff上继承的,但似乎两者都存在。 我想念的是什么?
答案 0 :(得分:4)
Stuff
构造函数将“ something”属性直接放在构造的对象上。无论您是创建父类还是继承类的实例,这都是正确的。不涉及原型链。
答案 1 :(得分:0)
在contructor中执行此操作时:
this.something = 'something';
您正在将该值放入对象而不是原型中。
即使您是子类,构造函数也会将'something'
的值添加到对象中。
如果要在原型上使用它,则必须将其设为静态:
class Stuff {
static get something() {
return 'something';
}
constructor() {
this.ownProp = true;
}
}
Stuff.somethingElse = 'somethingElse';
class MoreStuff extends Stuff {}
const stuff = new Stuff();
const moreStuff = new MoreStuff();
console.log(stuff.hasOwnProperty('something'));
console.log(stuff.hasOwnProperty('somethingElse'));
console.log(stuff.hasOwnProperty('ownProp'));
console.log(moreStuff.hasOwnProperty('something'));
console.log(moreStuff.hasOwnProperty('somethingElse'));
console.log(moreStuff.hasOwnProperty('ownProp'));
ownProp
仍然是实例的属性,其中something
和somethingElse
是类(原型)的属性