什么是“一个”呢;“拥有”;javascript中的属性

什么是“一个”呢;“拥有”;javascript中的属性,javascript,oop,properties,Javascript,Oop,Properties,这里我有一段代码,它使用getter和setter来定义和获取属性值。我使用对象构造函数创建了一个对象。我在for…in循环中传递了该对象。还对该对象使用了getOwnPropertyNames()方法。下面是结果 在for…in循环中可以访问“fullName”属性 “fullName”在getOwnPropertyNames()方法中不可见。这意味着它是 非自有财产 这里我有两个基本问题。什么是自有财产?如果“全名”不是自有财产,那么它是什么类型的财产? function Name(firs

这里我有一段代码,它使用getter和setter来定义和获取属性值。我使用对象构造函数创建了一个对象。我在for…in循环中传递了该对象。还对该对象使用了getOwnPropertyNames()方法。下面是结果

在for…in循环中可以访问“fullName”属性

“fullName”在getOwnPropertyNames()方法中不可见。这意味着它是

非自有财产

这里我有两个基本问题。什么是自有财产?如果“全名”不是自有财产,那么它是什么类型的财产?

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
getOwnPropertyNames
是指直接分配给对象的属性,而不仅仅是通过对象的原型链可以访问的属性。
this.foo=
bar.foo=
都算作自己的属性,因为您正在分配给实例

“自有财产”在本规范第1部分中定义为:

由其对象直接包含的属性

vs“继承的财产”,定义为:

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

也就是说,“own”属性位于实例上,而不是原型上

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

如果你看一看规范,它间接地排除了原型。在步骤#3中,运行时检查对象自身的属性,以获得适当的属性名称。但是,在(参考不带“own”限定符的
getProperty
)中,步骤3-4描述了如果在对象本身上找不到属性,则检查对象的原型。

返回直接在对象上的属性名称。例如,如果使用
obj.foo='bar'向对象添加新属性然后
“foo”
将包含在对象的自己的属性中
fullName
不是直接在
obj
上的属性,但它是此对象的属性:

{
    get fullName() {
        return this.first + " " + this.last;
    },

    set fullName(name) {
        var names = name.split(" ");
        this.first = names[0];
        this.last = names[1];
    }
}
正好是obj的内部原型

Object.getOwnPropertyNames( Object.getPrototypeOf( obj ) ); // ["fullName"]

循环遍历对象原型链中的所有可枚举属性,因此它将包含这些属性。

“它是什么类型的属性”有些人会说它是“继承的”属性。@FelixKling:谁不会?@Bergi:Dunno。我不确定这个术语有多正式,但它似乎是正式的。FWIW,如果这有帮助的话,本地变量和自由变量之间的区别是一样的……请注意,即使是赋值也可能不会创建属性,如果存在继承的setterwiw,则是当前规范;)@FelixKling我理解这个概念,比如说,proto的属性不是一个对象自己的属性。好啊但是在执行继承时,我们将通过从子级提供
this
来调用父级构造函数。此时,父对象(而非proto)的属性将被视为子对象的自有属性?Thanks@RajaprabhuAravindasamy如果您指的是子类构造函数中的
super
调用,那么父类或子类构造函数分配的属性都是自己的属性。区别在于prototype和direct。@RajaprabhuAravindasamy:因为
这个
将引用子对象,并且属性被分配给它,所以是的。“自有”属性的概念实际上非常简单,与构造函数或指定属性的“位置”无关。不要让构造函数和类给您一种JavaScript比它更复杂的印象;)