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