2015-04-06 64 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