hasOwnProperty正在遍历原型链

时间:2019-05-13 13:09:27

标签: javascript

今天我注意到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上继承的,但似乎两者都存在。 我想念的是什么?

2 个答案:

答案 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仍然是实例的属性,其中somethingsomethingElse是类(原型)的属性