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)
请帮忙!!
你的属性都不是对“父母”和“孩子”级,他们都在实例中通过创建(对象)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实例本身的键控。但通常没有必要走那么远。
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |