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