2013-04-01 48 views
0

是否可以通過例如多個對象在多個對象上執行單個功能?分組他們。我想要做的是一樣的東西:在多個對象上執行單一功能

{object1, object2, object3}.toFront(); 
+0

如何選擇各種'node.rectangle'元素/對象? –

+0

矩形的各種元素與問題無關,我只想合併這些對象。更新了問題,參見上文。 –

+0

這非常相關,因爲'Array'或'Object'原型可以擴展爲在數組或節點List上執行定義的函數。 –

回答

1

雖然你已經接受了答案,這是可能的1.6/5的ECMAScript第

function logElementID(element, index, array) { 
    var el = array[index], 
     prop = el.textContent ? 'textContent' : 'innerText'; 
    el[prop] = el.id; 
} 

[document.getElementById('one'), document.getElementById('two')].forEach(logElementID); 

JS Fiddle demo

或者通過延長Object原型:

function doStuff (el) { 
    console.log(el); 
}; 

Object.prototype.actOnGroup = function(func){ 
    var els = this.length ? this : [this]; 
    for (var i = 0, len = els.length; i<len; i++){ 
     func(els[i]); 
    } 
    return this; 
}; 

document.getElementsByTagName('div').actOnGroup(doStuff); 
document.getElementById('one').actOnGroup(doStuff); 

JS Fiddle demo

或者通過,同樣,延長Array原型:

function doStuff (el) { 
    console.log(el); 
}; 
Array.prototype.actOnGroup = function(func){ 
    var els = this.length ? this : [this]; 
    for (var i = 0, len = els.length; i<len; i++){ 
     func(els[i]); 
    } 
    return this; 
}; 

[document.getElementById('one'), document.getElementById('two')].actOnGroup(doStuff); 

JS Fiddle demo。順便提一下,如果您想爲沒有(相對)最新的JavaScript實現的用戶提供forEach()替代方案,那麼forEach()的Mozilla開發者網絡頁面提供以下算法,算法100%真實在ECMA-262,第5版':

// Production steps of ECMA-262, Edition 5, 15.4.4.18 
// Reference: http://es5.github.com/#x15.4.4.18 
if (!Array.prototype.forEach) { 

    Array.prototype.forEach = function forEach(callback, thisArg) { 

     var T, k; 

     if (this == null) { 
      throw new TypeError("this is null or not defined"); 
     } 

     // 1. Let O be the result of calling ToObject passing the |this| value as the argument. 
     var O = Object(this); 

     // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". 
     // 3. Let len be ToUint32(lenValue). 
     var len = O.length >>> 0; // Hack to convert O.length to a UInt32 

     // 4. If IsCallable(callback) is false, throw a TypeError exception. 
     // See: http://es5.github.com/#x9.11 
     if ({}.toString.call(callback) !== "[object Function]") { 
      throw new TypeError(callback + " is not a function"); 
     } 

     // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. 
     if (thisArg) { 
      T = thisArg; 
     } 

     // 6. Let k be 0 
     k = 0; 

     // 7. Repeat, while k < len 
     while (k < len) { 

      var kValue; 

      // a. Let Pk be ToString(k). 
      // This is implicit for LHS operands of the in operator 
      // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. 
      // This step can be combined with c 
      // c. If kPresent is true, then 
      if (Object.prototype.hasOwnProperty.call(O, k)) { 

       // i. Let kValue be the result of calling the Get internal method of O with argument Pk. 
       kValue = O[k]; 

       // ii. Call the Call internal method of callback with T as the this value and 
       // argument list containing kValue, k, and O. 
       callback.call(T, kValue, k, O); 
      } 
      // d. Increase k by 1. 
      k++; 
     } 
     // 8. return undefined 
    }; 
} 

逐字複製,從MDN forEach()文章參考(下文); 2013年4月1日,14:30。

參考文獻:

+0

哇,真的很有用的概述。感謝那! –

+0

我看不出爲什麼會有人想要定義一個'actOnGroup'函數,它幾乎與'each' /'forEach'完全相同(唯一不同的是它沒有用,因爲它不會返回原始數組),除了做出一個非常長的回答。 – deviousdodo

+0

它的選項是全部,我更喜歡'forEach'的替代實現,我個人只是簡單地選擇擴展答案,通過展示如何擴展'Object'或'Array'的原型。雖然我承認我通常會返回原始對象(我會立即編輯它)。 –

2

一個簡單的方法:

var nodes = [node.rectangle1, node.text, node.rectangle2]; 
for (var i = 0; i < nodes.length; i++) { 
    nodes[i].toFront(); 
} 

如果你使用underscore和喜歡簡潔:

_.invoke([node.rectangle1, node.text, node.rectangle2], 'toFront'); 

如果你想返回值可以請使用map或者如果您只想在each上進行一些額外的處理。

EDIT(做出這個完全):

您還可以使用內置的forEach在一個非常類似的方式(如果你不關心某些瀏覽器或您選擇墊片吧)下劃線each

以類似的方式是本地化通過JavaScript
[node.rectangle1, node.text, node.rectangle2].forEach(function(el) { 
    el.toFront(); 
}); 
+0

如果你可以使用下劃線,你可以使用_。map() –

+1

@ user1537158我已經提到過map和each,但沒有提供一個例子,因爲在docs中已經直接給出了一個例子,在這種情況下,'invoke'似乎是他真正想要的。 – deviousdodo

+0

+1 for u @deviousdodo –