资讯专栏INFORMATION COLUMN

细节:js 原型对象与for-in 方法枚举的问题

mumumu / 379人阅读

摘要:原型对象与方法枚举的问题原型属性的属性与的枚举问题有的时候设置成时仍然会被方法枚举到。新建立的原型对象的属性,也是按照规则返回结果。最后,再重申一遍,如果原型对象合实例存在同名属性,无论如何都会被枚举。

js 原型对象与for-in 方法枚举的问题 原型属性的[[enumerable]]属性与for-in 的枚举问题

有的时候[[enumerable]]设置成false 时仍然会被for-in 方法枚举到。详细情况如下:

function Person(){};

Person.prototype = {
    constructor: Person,
    name: "Oliver"
};
        
var person1 = new Person();
        
Object.defineProperty(person1,"name",{
enumerable: true
})

for (var x in person1){
    console.log(x);
}                                    

这里原型对象存在name 属性,person1 的name 属性enumerable 为true,可以枚举。

function Person(){};

Person.prototype = {
    constructor: Person,
    name: "Oliver"
};
        
var person1 = new Person();
        
Object.defineProperty(person1,"name",{
    enumerable: false
})

for (var x in person1){
    console.log(x);
}

这里原型对象存在name 属性,person1 的name 属性enumerable 为false,也可以枚举。

function Person(){};

Person.prototype = {
    constructor: Person,
};
        
var person1 = new Person();
        
Object.defineProperty(person1,"name",{
    enumerable: true
})

for (var x in person1){
    console.log(x);
}

这里原型对象不存在name 属性,person1 的name 属性enumerable 为true,可以枚举。

function Person(){};

Person.prototype = {
    constructor: Person,
};
        
var person1 = new Person();
        
Object.defineProperty(person1,"name",{
    enumerable: false
})

for (var x in person1){
    console.log(x);
}

这里原型对象不存在name 属性,person1 的name 属性enumerable 为false,不可枚举。

综上所述,原型对象和实例如果都存在同名属性,则无论实例中该属性的[[enumerable]]是true 还是false 都可以被for-in 枚举。

另一方面:

function Person(){};

Person.prototype = {
    constructor: Person,
    name: "Oliver"
};
        
var person1 = new Person();
        
Object.defineProperty(Person.prototype,"name",{
    enumerable: true
})

for (var x in Person.prototype){
    console.log(x);
}

原型对象的属性如果被修改了[[enumerable]],则按照规则返回结果。

function Person(){};

Person.prototype = {
    constructor: Person,
};
        
var person1 = new Person();
        
Object.defineProperty(Person.prototype,"name",{
    enumerable: false
})

for (var x in Person.prototype){
    console.log(x);
}

新建立的原型对象的属性[[enumerable]],也是按照规则返回结果。

最后,再重申一遍,如果原型对象合实例存在同名属性,无论如何都会被for-in 枚举。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78190.html

相关文章

  • JS高程读书笔记--第六章原型继承

    摘要:高程读书笔记第六章理解对象创建自定义对象的方式有创建一个实例,然后为它添加属性和方法。创建了自定义的构造函数之后,其原型对象默认只会取得属性至于其他方法都是从继承而来的。 JS高程读书笔记--第六章 理解对象 创建自定义对象的方式有创建一个Object实例,然后为它添加属性和方法。还可用创建对象字面量的方式 属性类型 ECMAScript在定义只有内部采用的特性时,描述了属性的各种特征...

    EasonTyler 评论0 收藏0
  • JS基础05「对象

    摘要:对象是的数据类型。对象是动态的,可以随时新增和删除自有属性。客户端中表示网页结构的对象均是宿主对象。提供第二个可选参数,用以对对象的属性进行进一步描述。没有原型的对象为数不多,就是其中之一。运算符的左侧是属性名字符串,右侧是对象。 对象是 JavaScript 的数据类型。它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值,因此我们可以把它看成是从字符串到值的映射。对象是...

    frolc 评论0 收藏0
  • 遍历DOM元素children属性遇到

    摘要:小结这下我们可以得出结论了个属性返回的对象不止能遍历到子元素,还能遍历到来自其原型的三个属性。既要防止那些添加修改了原型属性的对象遍历出多余的的结果,也要防止类似这种非标准属性返回一个属性的枚举性不可控的对象的坑。 问题的引出 关于DOM元素的children属性,以前我只在意它和childNodes属性的区别:即children属性只会返回子元素节点集合,而childNodes返回的...

    weknow619 评论0 收藏0
  • [javascript 学习笔记] 1. 面向对象

    摘要:当作构造函数来使用,作为普通函数来使用,当在全局作用域中调用一个函数时,对象总是指向对象。调用构造函数时会为实例添加一个指向最初原型的的指针,而把原型修改为另外一个对象就等于切断了构造函数于最初原型之间的联系。 ECMA-262 把对象定义为 无序属性的集合,其属性可以包含基本值、对象或者函数。 即对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映...

    Berwin 评论0 收藏0
  • JS面向对象程序设计之创建对象_工厂模式,构造函数模式,原型模式-1

    前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下。如有纰漏或错误,会非常感谢您的指出。文中绝大部分内容引用自《JavaScript高级程序设计第三版》。 2. 原型对象与in操作符 有两种方式使用in操作符: 单独使用和在for-in循环中使用。 单独使用时,in操作符会通过对象能够访问给定属性时返回true。 ==...

    incredible 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<