2012-06-08 74 views
4

我想通過向原型添加方法來添加擴展javascript對象的功能。
該方法將接收一個或多個其他對象,並將所有鍵/值添加到this
這是我想出了:使用CoffeeScript擴展Javascript對象

Object::extend = (objects...) -> 
    @[key] = value for key, value of object for object in objects 

或本:

Object::extend = (objects...) -> 
    for object in objects 
     for key, value of object 
      @[key] = value 

兩個工作不如預期,並編譯成相同的javascript代碼:

var __slice = [].slice; 

Object.prototype.extend = function() { 
    var key, object, objects, value, _i, _len, _results; 
    objects = 1 <= arguments.length ? __slice.call(arguments, 0) : []; 
    _results = []; 
    for (_i = 0, _len = objects.length; _i < _len; _i++) { 
    object = objects[_i]; 
    _results.push((function() { 
     var _results1; 
     _results1 = []; 
     for (key in object) { 
     value = object[key]; 
     _results1.push(this[key] = value); 
     } 
     return _results1; 
    }).call(this)); 
    } 
    return _results; 
}; 

我」什麼我不太高興的是整個循環創建的結果,這對我的目的來說完全是多餘的。
有沒有辦法讓更多像代碼:

Object.prototype.extend = function() { 
    var key, object, objects, value, _i, _len; 
    objects = 1 <= arguments.length ? __slice.call(arguments, 0) : []; 
    for (_i = 0, _len = objects.length; _i < _len; _i++) { 
    object = objects[_i]; 
    (function() { 
     for (key in object) { 
     value = object[key]; 
     this[key] = value; 
     } 
    }).call(this); 
    } 
}; 

感謝。


編輯

我知道,我可以簡單地embed javascript代碼,但是找了CoffeeScript的解決方案。

+0

你有沒有注意到'coffeescript'標籤? javascript代碼是將coffeescript編譯成javascript的結果,我沒有寫這個js代碼。 –

+0

只是注意到並立即刪除了我的評論...哎呀。 – jahroy

+0

Yuck,修改'Object.prototype' –

回答

3

你可以嘗試添加一個明確的return

Object::extend = (objects...) -> 
    for object in objects 
     for key, value of object 
      @[key] = value 
    return 

產生這樣的:

var __slice = [].slice; 

Object.prototype.extend = function() { 
    var key, object, objects, value, _i, _len; 
    objects = 1 <= arguments.length ? __slice.call(arguments, 0) : []; 
    for (_i = 0, _len = objects.length; _i < _len; _i++) { 
    object = objects[_i]; 
    for (key in object) { 
     value = object[key]; 
     this[key] = value; 
    } 
    } 
}; 

每CoffeeScript的函數返回函數的最後一個表達式的值,CoffeeScript的循環也表現。這意味着CoffeeScript必須構建所有_results的東西來爲您的函數生成返回值,因爲您有一個隱含的return應用於外部循環。如果通過添加一個明確的「return nothing」來刪除隱含的return,那麼CS → JS編譯器似乎足夠聰明,不會做所有額外的_results工作。

+0

太棒了!這正是我所期待的!雖然我用我的第一個版本去了。謝謝。 –

+0

最後返回@以使鏈接調用成爲可能。 – elisium