如何检查属性是否只属于 Javascript 中的子类或子类?

Inf*_*Dev 1 javascript node.js ecmascript-6

我正在尝试获取仅存在于子类(子类)中而不存在于 Javascript 中的父类中的属性(不包括函数)。我正在使用,.hasOwnProperty()但它也true用于父类的属性。我在 node.js 中运行它。

代码:

class Model{
  constructor(){
    this.location = 'Gotham'
  }
}

class Superhero extends Model{
}

const superhero = new Superhero()
superhero.alias = 'Batman'
superhero.realName = 'Bruce Wayne'

for (const property in superhero){
  if (superhero.hasOwnProperty(property) && (typeof superhero[property] !== 'function')){
    console.log(`${property} = ${superhero[property]}`)
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

location = Gotham
alias = Batman
realName = Bruce Wayne
Run Code Online (Sandbox Code Playgroud)

我想得到的输出:

alias = Batman
realName = Bruce Wayne
Run Code Online (Sandbox Code Playgroud)

请帮忙!!

T.J*_*der 5

你的属性都不是对“父母”和“孩子”级,他们都在实例中通过创建(对象)new Superhero。看一下实例,无法判断location是由Model构造函数添加到实例中的,而另外两个是由构造函数添加到实例中的Superhero。这些信息并不是 JavaScript 对象模型的一部分。

从您开始循环的位置开始,以下是您在内存中的内容(省略了一些细节):

            +????????????+
型号??????>| (功能) |
            +????????????+ +???????????????+                      
            | 原型|??????????????????????????????+??>| (对象) |                      
            +????????????+/+???????????????+                      
                                                    | | [[原型]] |????>Object.prototype
                                                    | +???????????????+                      
                                                    |
                                                    |
            +????????????+ |
超级英雄??>| (功能) | |
            +????????????+ +???????????????+ |
            | 原型|????+?>| (对象) | |
            +????????????+ / +???????????????+ |
                             | | [[原型]] |??+
                             | +???????????????+
                             |
                             +?????????????+
                                          \
            +????????????????????????????+ |
超级英雄??>| (对象) | |
            +????????????????????????????+ |
            | [[原型]] |???+
            | 地点:“哥谭” |
            | 别名:“蝙蝠侠” |
            | 真实姓名:“布鲁斯韦恩” |
            +??????????????????????????????+

如您所见,所有属性都在实例本身上。

如果在实例instance原型上,您将能够区分它们,但不能区分它们是实例本身的所有属性。

您可以location通过将其设置为访问器属性来移动到原型(特别是实例原型的原型):

            +????????????+
Model??????>| (function) |
            +????????????+                               +???????????????+                      
            | prototype  |???????????????????????????+??>|   (object)    |                      
            +????????????+                          /    +???????????????+                      
                                                    |    | [[Prototype]] |????>Object.prototype
                                                    |    +???????????????+                      
                                                    |
                                                    |
            +????????????+                          |
Superhero??>| (function) |                          |
            +????????????+       +???????????????+  |
            | prototype  |????+?>|   (object)    |  |
            +????????????+   /   +???????????????+  |
                             |   | [[Prototype]] |??+
                             |   +???????????????+
                             |
                             +???????????+
                                          \
            +?????????????????????????+   |
superhero??>|         (object)        |   |
            +?????????????????????????+   |
            | [[Prototype]]           |???+
            | location: "Gotham"      |
            | alias:    "Batman"      |
            | realName: "Bruce Wayne" |
            +?????????????????????????+

在那个例子中,因为我们必须存储location某个地方的值,所以我创建了一个_location属性来存储它。虽然它仍然在实例上,并且可以在不通过访问器的情况下设置。(它没有出现在for-in循环中,因为我使它不可枚举。)如果我们想真正保护它,我们必须将它与实例分开存储,可能是通过使用WeakMap实例本身的键控。但通常没有必要走那么远。