Javascript 构造函数函数原型可枚举?
在阅读了一些文章和文档之后,我仍然不清楚可枚举属性的真正定义。接下来,让我告诉你我困惑的地方: 我创建了一个构造函数并添加了一个原型Javascript 构造函数函数原型可枚举?,javascript,Javascript,在阅读了一些文章和文档之后,我仍然不清楚可枚举属性的真正定义。接下来,让我告诉你我困惑的地方: 我创建了一个构造函数并添加了一个原型 var myAlphabet = function() { this.c = 5 this.d = 6 } myAlphabet.prototype = { e:7 } for( key in myObj){ console.log(key); } 现在,我使用new关键字创建myAlphabet的一个新实例 var myObject =
var myAlphabet = function() {
this.c = 5
this.d = 6
}
myAlphabet.prototype = {
e:7
}
for( key in myObj){
console.log(key);
}
现在,我使用new关键字创建myAlphabet的一个新实例
var myObject = new myAlphabet();
使用for-in循环,我希望console.log myObject实例中的所有键(而不是原型中的键)
此日志记录:
'c'
'd'
'e'
根据for..in-loop文档:
for..in语句迭代
对象,按任意顺序。对于每个不同的属性,
语句可以被执行
这让我相信原型是一个可枚举属性
。但是阅读可枚举属性的文档
属性的所有权取决于属性是否直接属于对象而不是其原型链
因此,前面创建的原型并不直接位于myObject实例上,而是包含在原型链中。为什么我在每个键上循环时都包含这个
为什么我在每个键上循环时都包含这个
正是通过设计javascript的对象原型,才是它们继承值的方式
就像你上课一样
class:base
{
c:2
d:3
}
base
{
a:1
}
如果实例化myAlphabet类型的对象,它将具有属性a、b和c
不同之处在于,在具有类的语言中,实例将“包含”所有值
它定义的和父类定义的
instance of class
{
a:1//because my parent told me so
c:2
d:3
}
在原型语言中,对象派生自对象,这意味着值不驻留在实例本身中,而是驻留在充当父对象的实例上
object1
{
prototype:object2//hidden from enumerator
c:2
d:3
...//when enumerating include all from prototype
}
object2
{
prototype:null//hidden from enumerator
a:1
...//when enumerating include all from prototype
}
因此,您实际上维护了继承,就像它处理分类语言一样
主要区别在于,继承是动态进行的。。如果在从子对象读取警报(object1.a)时更改object2.a=new
,则这些值实际上驻留在原型对象中,它将从父对象获取新的更新值new
如果需要知道枚举属性是否驻留在从父对象获取的对象本身中,则必须使用
object1.hasOwnProperty(a)
仅获取myObj的属性,而不是原型doif(myObj.hasOwnProperty(key))
。那么您不想在输出中包含“e”?如果您想为myAlphabet定义属性,但不在myObject上定义属性,可以使用对象。定义属性