首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造函数原型可枚举?

构造函数原型可枚举?
EN

Stack Overflow用户
提问于 2014-10-17 16:57:07
回答 1查看 443关注 0票数 3

在阅读了几篇文章和文档之后,我仍然不清楚可枚举属性的真正定义。向前看,让我带你去看看我困惑的地方:

我创建一个构造函数并添加一个原型。

代码语言:javascript
复制
var myAlphabet = function() {
  this.c = 5
  this.d = 6
}

myAlphabet.prototype = {
  e:7
}

现在,我使用新关键字创建一个新的myAlphabet实例

代码语言:javascript
复制
var myObject = new myAlphabet();

使用for-in循环,我希望console.log myObject实例中的所有键(而不是原型中的键)。

代码语言:javascript
复制
for( key in myObj){
    console.log(key);
}

这个日志:

代码语言:javascript
复制
'c'
'd'
'e'

根据for..in循环文档:

for..in语句按任意顺序迭代对象的可枚举属性。对于每个不同的属性,都可以执行语句。

这让我相信原型是enumerable property。但是阅读Enumerable properties的文档

属性的所有权取决于属性是否直接属于对象,而不属于对象的原型链。

因此,前面创建的原型不是直接在myObject实例上创建的,而是包含在原型链中的。当我在每个键上循环时,为什么包括这个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-17 17:19:57

当我在每个键上循环时,为什么包括这个?

正是通过设计javascript的对象原型,才是它们继承价值的方式

就像你有课一样

代码语言:javascript
复制
class:base
{
    c:2
    d:3
}
base
{
    a:1
}

如果实例化一个类型为myAlphabet的对象,它将具有a,b and c属性,区别在于,在具有类的语言中,实例将“包含”由它定义的所有值和由父类定义的值。

代码语言:javascript
复制
instance of class
{
    a:1//because my parent told me so
    c:2
    d:3
}

在原型语言中,对象派生自对象,这意味着值不驻留在实例本身,而是驻留在充当父实例的实例上。

代码语言:javascript
复制
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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26429894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档