在阅读了几篇文章和文档之后,我仍然不清楚可枚举属性的真正定义。向前看,让我带你去看看我困惑的地方:
我创建一个构造函数并添加一个原型。
var myAlphabet = function() {
this.c = 5
this.d = 6
}
myAlphabet.prototype = {
e:7
}现在,我使用新关键字创建一个新的myAlphabet实例
var myObject = new myAlphabet();使用for-in循环,我希望console.log myObject实例中的所有键(而不是原型中的键)。
for( key in myObj){
console.log(key);
}这个日志:
'c'
'd'
'e'根据for..in循环文档:
for..in语句按任意顺序迭代对象的可枚举属性。对于每个不同的属性,都可以执行语句。
这让我相信原型是enumerable property。但是阅读Enumerable properties的文档
属性的所有权取决于属性是否直接属于对象,而不属于对象的原型链。
因此,前面创建的原型不是直接在myObject实例上创建的,而是包含在原型链中的。当我在每个键上循环时,为什么包括这个?
发布于 2014-10-17 17:19:57
当我在每个键上循环时,为什么包括这个?
正是通过设计javascript的对象原型,才是它们继承价值的方式
就像你有课一样
class:base
{
c:2
d:3
}
base
{
a:1
}如果实例化一个类型为myAlphabet的对象,它将具有a,b and 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
}因此,您实际上维护了继承,就像它可以处理类语言一样--主要的区别是,继承是动态进行的。如果您在从子object2.a = new读取时更改了alert(object1.a),那么它将从父new获取新更新的值。
如果需要知道枚举属性是否驻留在从父对象获取的对象本身中,则必须使用object1.hasOwnProperty(a)。
https://stackoverflow.com/questions/26429894
复制相似问题