2014-12-09 3 views
0

예, 나는 OOP 언어에 적용되는 방식이나 전혀 적용되지 않는 용어를 사용함을 알고 있습니다.확장 메서드를 정의하고 인스턴스 및 정적 메서드로 호출하는 방법은 무엇입니까?

C#에서 확장 메서드를 정의 할 때이를 인스턴스 메서드 foo.call(bar) 또는 Foo.call(foo,bar)이라고 부를 수 있습니다. 요소의 동등성을 검사하는 Arrayequals(secondArray,comparer)에 대한 "확장"방법을 정의했습니다. 지금은 myArray1.equals(myArray2)이라고 부릅니다.

그러나 나는 이것을 Array.equals(myArray1,myArray2)이라고도 부릅니다.

JS 편이 만드는 방법은?

+0

어떤 언어를 사용하고 계십니까? – SLaks

+0

@ SLaks, 목표물 하나? 자바 스크립트. – greenoldman

답변

1

예를 들어 SLaks answer에 대해 자세히 설명하려면 다음과 같이하십시오. "정적"메소드를 제공 한 다음 인스턴스를 정적 ​​메소드에 명시 적으로 전달하는 인스턴스 메소드를 제공 할 수 있습니다.

var Obj = function(){ 
    var _this = this; 
    this.x = 5; 
    this.equals = function(other){ 
     return Obj.equals(_this, other); 
    } 
} 
Obj.equals = function(obj1, obj2){ 
    return obj1.x == obj2.x; 
} 

obj1 = new Obj(); 
obj2 = new Obj(); 
console.log(obj1.equals(obj2)); 
console.log(Obj.equals(obj1, obj2)); 

콘솔 출력 :

이 유사 OozeMaster의 대답에
true 
true 
+0

예를 들어 주셔서 감사합니다! – greenoldman

1

두 가지 별도의 메소드를 만들어야합니다. 하나는 프로토 타입이고 하나는 기능입니다.

그 중 하나는 단순히 다른 하나를 호출 할 수 있습니다.

1

, 당신은 또한보다 "OO"방식으로이 방법을 쓸 수 있습니다 (하지만 여전히, 당신은 명시 적으로 "정적"을 선언해야하고 멤버 메서드) :

var Operation = (function() { 
    function Operation(firstOperand) { 
     this.firstOperand = firstOperand; 
    } 
    Operation.prototype.add = function (other) { 
     console.log(this.firstOperand + other); 
    }; 
    Operation.add = function (first, second) { 
     console.log(first + second); 
    }; 
    return Operation; 
})(); 


Operation.add(1, 2); // prints 3 
var op = new Operation(3); 
op.add(4); // prints 7 

PS : 이것은 정적 메서드를 쓸 때 Typescript에 의해 생성되는 코드 종류입니다. JS를 OOP 방식으로 작성하려면 타이프 스크립트 (text)를보고 싶을 수도 있습니다. http://www.typescriptlang.org/

+0

TS에 대한 힌트를 가져 주셔서 감사합니다. A.Hejlsberg가 지금 TS (Google TechTalks)에 대해 이야기하는 것을보고 있습니다 .--). – greenoldman

관련 문제