如何获得函数属性的可迭代对象?

时间:2018-08-27 08:06:04

标签: javascript function properties

在使用JavaScript对象将“ 绑定”数据描述到UI视图的情况下,可能有必要访问该对象的所有属性。

实际用例可能正在构建可动态更改的编辑框。 enter image description here

有没有办法获取包含所有功能字段(没有功能和对象)的对象?

function Airplane() {
    _id,
    _cruiserSpeed,
    _maxWeightCapacity,
    _maxFlightHeight,
    _fuelState,
    _airCompanyOwner,
    _seats = []

    this.fly = function(departurePoint, destinationPoint) {

    }
}

这样我们就可以像这样遍历它们。

for (var field in context.fields) {

}

语言是否普遍支持这种反映? (可能是 proto 属性之一)

现在,找出的唯一解决方案是使用嵌套对象。但这会增加对属性的简单访问的复杂性( context._id context._fields._id )。

function Airplane() {
    this._fields = {
        _id,
        _cruiserSpeed,
        _maxWeightCapacity,
        _maxFlightHeight,
        _fuelState,
        _airCompanyOwner,
        _seats = []
    }

    this.fly = function(departurePoint, destinationPoint) {

    }
}

2 个答案:

答案 0 :(得分:3)

您可以轻松判断属性是否在for-in循环中引用了一个函数:

for (var name in object) {
    if (typeof object[name] === "function") {
        // It's a function
    } else {
        // It isn't
    }
}

(在旧的浏览器中曾经出现过这样的问题,浏览器提供的某些功能用"object"代替了"function",但现在已经过时了。)

您还可以使用=== "object"而不是=== "function"来判断它是否引用了对象。

从您的问题中尚不清楚您想要什么(属性名称,仅包含属性子集的新对象)以及是否需要/不希望使用函数和对象,但这应该可以使您指出正确的方法

More about typeof on MDN

例如,如果您想要一个不包含函数或对象的属性名称数组:

var names = [];
for (var name in object) {
    switch (typeof object[name]) {
        case "function":
        case "object":
            break;
        default:
            names.push(name);
            break;
}

(我不在那里使用Object.keysObject.entries,因为您提到要访问继承的属性。)

答案 1 :(得分:-1)

您只需要使用“ typeof”运算符-

for(var prop in obj){
if((typeof obj[prop] !== 'object') && (typeof obj[prop] !== 'function')){
 // do whatever you want
}}