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)
    hasOwnProperty并getOwnPropertyNames引用直接分配给对象的属性,而不是仅通过对象的原型链访问.无论是this.foo =或bar.foo =数作为自己的财产,因为你分配给实例.
"自有属性" 在规范4.3.30节中定义为:
由其对象直接包含的属性
vs"继承属性",定义为(4.3.31):
对象的属性不是自己的属性,而是对象原型的属性(自己的或继承的)
也就是说,实例上有"自己的"属性,而不是原型.
最大的影响是原型类(具有一些方法和/或静态属性的构造函数).在经典的OO术语中,getOwnPropertyNames将跳过类方法和任何具有static关键字的东西.
如果您查看规范的第8.12.1节,它会间接排除原型.在步骤#3中,运行时检查对象自己的属性以获取相应的属性名称.但是,在第8.12.2节(指getProperty没有"自己的"限定符)中,步骤#3-4描述了如果在对象本身上找不到属性,则检查对象的原型.