2015-04-06 33 views
2


我有一个函数,它检查两个DOM元素的计算样式属性值,如果每个属性是等价的,它应该返回true或false。模拟Javascript中的对象的每个()对象

checkUserBlock: function (userBlockSelector, properties) { 
     var checker = this.setCheckingStyle(userBlockSelector, properties); 
     var userBlockCompStyle = getComputedStyle(this.getUserBlock(userBlockSelector)); 
     var checkBlockCompStyle = getComputedStyle(checker); 
     var checkingStyle = this.parseCheckingStyle(properties); 
     for(var key in checkingStyle){ 
      return (userBlockCompStyle.getPropertyValue([key].toString()) == checkBlockCompStyle.getPropertyValue([key].toString())); 
     } 
    } 

我有问题,所有属性的返回结果和我想每一个()函数,但其​​只针对阵列。如何将它用于对象,或者您可以在没有jQuery的情况下提供不同的解决方案?

回答

2

你可以这样定义一个函数:

function every(callback) { 
    for(prop in this) { if(!callback(this[prop])) return false; }; 
return true; 
} 

你可以拍打一个物体,它会遍历其可枚举的属性:

var obj = {1: 1, b: 3, E: 4}; 
Object.defineProperty(obj, 'every', { value: every, enumerable: false, writable: true, configurable: true }); 
obj.every(function(item) { return item < 5; }) 
//true 
obj.every(function(item) { return item < 1; }) 
//false 

或者你可以猴子补丁Object.prototype给予every方法的所有对象:

Object.defineProperty(Object.prototype, 'every', { value: every, enumerable: false, writable: true, configurable: true }); 

另外,您可以使用Object.getPropertyNames,如果你不希望每次申请prototypically继承属性:

function every(callback) { 
     var propertyNames = Object.getOwnPropertyNames(this); 
     var length = propertyNames.length; 
     for (var i=0; i < length; i++) { 
     if(!callback(this[propertyNames[i]])) return false; 
     } 
    return true; 
} 

这个你可以一巴掌到你的对象protytpe而不必担心使得它在inenumerable:

var obj = Object.create({every: every}); 
obj[1]=1; obj.b=3; obj.E=4; 
obj.every(function(item) { return item < 5; }) 
//true 
obj.every(function(item) { return item < 1; }) 
//false 
+0

不,你可以不用担心'Object.prototype'的方法而不用担心可枚举性,就像你最后一个例子那样? – Bergi 2015-04-06 12:38:15

+0

@Bergi感谢您的评论。我误以为Object.getProrotypeOf({})!== Object.prototype。我已经修复了最后一个示例,以便它现在具有未分享的原型。 – PSkocik 2015-04-06 13:23:48

0

这会给你的属性名称,然后你可以遍历数组(改编自https://stackoverflow.com/a/328418/4670652):

function propertiesArray(obj) { 
    var propList = []; 
    for(var propName in obj) { 
     if(typeof(obj[propName]) != "undefined") { 
     propList.push(propName); 
     } 
    } 
    return propList; 
} 
+0

没有理由不只是使用'Object.k eys'。 – Bergi 2015-04-06 12:36:53