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的属性,而不是原型do
if(myObj.hasOwnProperty(key))
。那么您不想在输出中包含“e”?如果您想为myAlphabet定义属性,但不在myObject上定义属性,可以使用
对象。定义属性