当前位置: 首页 > 面试题库 >

是否可以获得对象的不可枚举的继承属性名称?

万俟渊
2023-03-14
问题内容

在JavaScript中,我们有几种获取对象属性的方式,具体取决于我们想要获取的内容。

1)Object.keys(),它返回对象的所有自己的,可枚举的属性,即ECMA5方法。

2)for...in循环,返回对象的所有可枚举属性,无论它们是自己的属性还是从原型链继承。

3)Object.getOwnPropertyNames(obj)返回对象本身的所有属性,无论是否可枚举。

我们还拥有诸如hasOwnProperty(prop)让我们检查属性是否继承或实际上属于该对象之类的方法,以及propertyIsEnumerable(prop)顾名思义,可以让我们检查属性是否可枚举的方法。

使用所有这些选项,就无法获得对象的 不可枚举,非自有 属性,这就是我想要做的。有什么办法吗?换句话说,我能以某种方式获得继承的不可枚举属性的列表吗?

谢谢。


问题答案:

由于getOwnPropertyNames可以获取不可枚举的属性,因此可以使用它,并将其与沿原型链向上移动结合起来。

function getAllProperties(obj){
    var allProps = []
      , curr = obj
    do{
        var props = Object.getOwnPropertyNames(curr)
        props.forEach(function(prop){
            if (allProps.indexOf(prop) === -1)
                allProps.push(prop)
        })
    }while(curr = Object.getPrototypeOf(curr))
    return allProps
}

我在Safari 5.1上测试过

> getAllProperties([1,2,3])
["0", "1", "2", "length", "constructor", "push", "slice", "indexOf", "sort", "splice", "concat", "pop", "unshift", "shift", "join", "toString", "forEach", "reduceRight", "toLocaleString", "some", "map", "lastIndexOf", "reduce", "filter", "reverse", "every", "hasOwnProperty", "isPrototypeOf", "valueOf", "__defineGetter__", "__defineSetter__", "__lookupGetter__", "propertyIsEnumerable", "__lookupSetter__"]

更新: 稍微重构了代码(添加了空格和花括号,并改进了函数名称):

function getAllPropertyNames( obj ) {
    var props = [];

    do {
        Object.getOwnPropertyNames( obj ).forEach(function ( prop ) {
            if ( props.indexOf( prop ) === -1 ) {
                props.push( prop );
            }
        });
    } while ( obj = Object.getPrototypeOf( obj ) );

    return props;
}


 类似资料:
  • 本文向大家介绍请举例说明css有哪些不可继承的属性?相关面试题,主要包含被问及请举例说明css有哪些不可继承的属性?时的应答技巧和注意事项,需要的朋友参考一下 1、display:规定元素应该生成的框的类型 2、文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shadow:文本阴影效果 white-space:空白符的处理 u

  • 问题内容: 如果我有发言权,。 当然,分配新的属性没有问题, 但是之后我想将其删除,因此这里无济于事。 所以, 是这样的。但是,还有一种更“优雅”的方式吗? 问题答案: 这适用于数组元素,变量和对象属性。 例:

  • 问题内容: 为什么Java中的枚举不能从其他枚举继承?为什么以这种方式实施? 问题答案: 例子 因为将元素添加到枚举将有效地创建超类,而不是子类。 考虑: 这与常规类的工作方式相反。我想可以以这种方式实施,但实施起来比看起来要复杂得多,而且肯定会使人们感到困惑。

  • 问题内容: 您可以在Swift中继承枚举吗?关于枚举继承,应该注意哪些规则? 以下测试代码: 产生 问题答案: 在Swift语言中,我们有Structs,Enum和Classs。Struct和Enum通过副本传递,而类通过引用传递。只有类支持继承,枚举和结构不支持。 因此,要回答您的问题,您不能继承Enum(和Struct类型)。在这里看看:

  • 问题内容: 在JavaScript中,我创建了一个像这样的对象: 如果直到运行时才确定属性名称,是否可以在初始创建此对象后为其添加其他属性?即 问题答案: 是。