这里我有一个使用 getter 和 setter 来定义和获取属性值的代码。我使用对象构造函数创建了一个对象。我在 for...in 循环中传递了该对象。还在该对象上使用了 getOwnPropertyNames() 方法。这是结果
“fullName”属性可在 for...in 循环中访问
“fullName”在 getOwnPropertyNames() 方法中不可见。这意味着它是
不是自己的财产
这里我有两个基本问题。什么是自有财产?如果“fullName”不是自己的财产那么它是什么类型的财产?
function Name(first, last) {
this.first = first;
this.last = last;
}
Name.prototype = {
get fullName() {
return this.first + " " + this.last;
},
set fullName(name) {
var names = name.split(" ");
this.first = names[0];
this.last = names[1];
}
};
var obj=new Name('al','zami');
for(var i in obj){
console.log(i); // fullName is here
}
console.log(Object.getOwnPropertyNames(obj)); // fullName is not here
hasOwnProperty
and getOwnPropertyNames
参考分配的属性directly到对象,而不仅仅是通过对象的原型链进行访问。任何一个this.foo =
or bar.foo =
算作自己的属性,因为您要分配给实例。
“自己的财产”的定义是第 4.3.30 节规格为:
其对象直接包含的属性
与定义的“继承财产”(4.3.31) as:
对象的属性不是自己的属性,而是该对象原型的属性(自己的或继承的)
也就是说,“自己的”属性位于实例上,而不是原型上。
最大的影响是原型类(具有某些方法和/或静态属性的构造函数)。用经典的面向对象术语来说,getOwnPropertyNames
将跳过类方法和任何有static
关键词。
如果你看一下第8.12.1节规范中,它间接排除了原型。在步骤 #3 中,运行时检查对象自身的属性以获取适当的属性名称。然而,在第8.12.2节(指getProperty
没有“own”限定符),步骤 #3-4 描述了如果在对象本身上没有找到该属性,则检查对象的原型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)