2012-06-08 3 views
4

프로토 타입에 메소드를 추가하여 javascript 객체를 확장하는 기능을 추가하고 싶습니다.
메서드는 하나 이상의 다른 개체를 받고 모든 키/값을 this에 추가합니다.CoffeeScript로 자바 스크립트 객체 확장하기

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 

두 작업이 예상대로, 같은 자바 스크립트 코드로 컴파일 :
이 내가 생각 해낸 것입니다 내가 '무엇

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; 
}; 

너무 행복하지 않다는 것은 내 목적에 완전히 중복되는 for 루프마다 작성되는 전체 결과이다.

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 자바 스크립트 코드,하지만 커피 스크립트 솔루션을 찾고 수 있다는 것을 알고 있어요.

+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; 
    } 
    } 
}; 

모든 커피 스크립트 함수는 함수의 마지막 표현식의 값을 반환, 커피 스크립트 루프는 표현이다. 즉, 바깥 쪽 루프에 적용 할 암시 적 return이 있었기 때문에 CoffeeScript는 해당 _results 물건을 모두 만들어야 함수에 대한 반환 값을 생성해야합니다. 명시 적으로 "return nothing"을 추가하여 그 암시 적 return을 제거하면 CS → JS 컴파일러가 추가적으로 _results 작업을 수행하지 않을 정도로 똑똑한 것으로 보입니다.

+0

좋아요! 이것은 내가 찾고 있었던 바로 그 것이다! 나는 첫 번째 판과 함께 갔지만. 고맙습니다. –

+0

체인 호출 가능성을 높이려면 마지막에 @를 반환하는 것이 좋습니다. – elisium