javascript中什么是“自己的”属性

2023-11-21

这里我有一个使用 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(使用前将#替换为@)

javascript中什么是“自己的”属性 的相关文章