什么是javascript中的"OWN"属性

AL-*_*ami 3 javascript oop properties

这里我有一个使用getter和setter来定义和获取属性值的代码.我使用对象构造函数创建了一个对象.我在for ... in循环中传递了对象.还在对象上使用了getOwnPropertyNames()方法.结果如下

可以在for循环中访问"fullName"属性

"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
Run Code Online (Sandbox Code Playgroud)

ssu*_*ube 7

hasOwnPropertygetOwnPropertyNames引用直接分配给对象的属性,而不是仅通过对象的原型链访问.无论是this.foo =bar.foo =数作为自己的财产,因为你分配给实例.

"自有属性" 在规范4.3.30节中定义为:

由其对象直接包含的属性

vs"继承属性",定义为(4.3.31):

对象的属性不是自己的属性,而是对象原型的属性(自己的或继承的)

也就是说,实例上有"自己的"属性,而不是原型.

最大的影响是原型类(具有一些方法和/或静态属性的构造函数).在经典的OO术语中,getOwnPropertyNames将跳过类方法和任何具有static关键字的东西.

如果您查看规范的第8.12.1节,它会间接排除原型.在步骤#3中,运行时检查对象自己的属性以获取相应的属性名称.但是,在第8.12.2节(指getProperty没有"自己的"限定符)中,步骤#3-4描述了如果在对象本身上找不到属性,则检查对象的原型.

  • @RajaprabhuAravindasamy:因为`this`将引用子对象并且属性被分配给它,是的."拥有"属性的概念实际上非常简单,并且与构造函数或"where"属性无关.不要让构造函数和类给你的印象是JavaScript比它更复杂;) (2认同)