2013-05-07 2 views
2

JavaScript 객체의 "functor"기능 만 바꾸고 싶습니다. JavaScript의 "functor"만 바꾸기

자바 스크립트에서이 작업을 수행 할 수있는 방법이 있나요 내가 PART 1에 액세스 할 수 있으며 개체의 기능을 수정할 필요가 없습니다 때문에이 필요

// PART 1: Declaration 
function obj() { 
    return obj.a + " " + obj.b; 
}; 
obj.a = "a"; 
obj.b = "b"; 
confirm(obj()); // output: "a b"; 

// PART 2: Modification 
// now replace only functor 
// (not working this way as it replaces the whole object) 
obj = function() { 
    return obj.b + " " + obj.a; 
}; 
confirm(obj()); // expected output: "b a"; 

... 다음 코드는 문제를 보여줍니다 ?

복사 (예 :와에 대한 루프)은 모든 숨겨진 속성을 복사하지 않는 한 ... 작동하지 않는

UPDATE : 그것은 정의되지 수정 된 코드 ...

UPDATE2 :이 예를 들어 제대로 작동이 :

,536 (... 그러나 내 문제가 해결되지 않았다)

obj = $.extend(function() { return obj.b + " " + obj.a; }, obj); 
confirm(obj()); // output: "b a"; 

을 (jQuery를 필요)

+0

모든 브라우저에서 정의되지 않음 undefined –

+1

자바 스크립트 객체는 없으며 함수 만 존재합니다. 'a'와'b'는 함수의 속성이고, 그것들을 포함하는 객체는 없습니다. – Barmar

+0

"for-loop"코드를 게시 할 수 있습니까? – Dogbert

답변

0

함수/개체를 반전해야합니다. 그것은 객체를 만들고 그 안에 함수를 넣는 것입니다. 이 함수를 호출하기 위해 당신이 이렇게 개체를 지정해야 함을 의미합니다 :

obj = { 
    functor : function() { 
    return this.a + " " + this.b; 
    } 
}; 
obj.a = "a"; 
obj.b = "b"; 
confirm (obj.functor()); // output: "a b"; 

// PART 2: Modification 
// now replace only functor 
obj.functor = function() { 
    return this.b + " " + this.a; 
}; 
confirm (obj.functor()); // expected output: "b a"; 
+0

이것은 obj() 객체를 호출 할 때 obj()를 호출 할 때 작동하지 않고 그 값을 변경할 수 없습니다. –

0

내가 이런 식으로 포장 것 (크롬의 콘솔에이 코드를 붙여 넣기) :

// PART 1 - exactly as provided 

function obj() { 
    return obj.a + " " + obj.b; 
}; 
obj.a = "a"; 
obj.b = "b"; 
console.log(obj()); // output: "a b"; 

// PART 2 - object is used in different context 

var API = { 
    setObj: function(obj) { 
     this._obj = obj; 
    }, 
    useObj: function() { 
     console.log("API: " + this._obj()); 
    } 
} 

API.setObj(obj); 
API.useObj(); 

// PART 3 - wrapping obj, changing it's default behavior 

objWrapper = function(obj) { 

    var wrappedObj = function() { 
     return wrappedObj.b + " " + wrappedObj.a; 
    } 

    var i; 
    for(i in obj) { 
     if(obj.hasOwnProperty(i)) { 
      wrappedObj[i] = obj[i]; 
     } 
    } 

    return wrappedObj; 
} 
obj = objWrapper(obj); 
console.log(obj()); // expected output: "b a"; 
console.log(obj.a); 
console.log(obj.b); 
obj.c = "c"; 
console.log(obj.c); 

// PART 4 - checking different context 

API.setObj(obj); 
API.useObj(); 

이가 네가 할 수있는 유일한 방법. 이 함수에 대한 모든 참조를 업데이트해야합니다. 따라서 API.setObj(obj);을 시뮬레이트 할 수 없다면 작동하지 않을 수 있습니다. 함수 본문 만 다시 정의 할 수는 없습니다. 앞으로는 실제로 도움이 될 수 있으므로 JS를 추가 할 예정이며 JS가 더 기능적인 프로그래밍 언어가 될 것입니다. 이

는 도움이되기를 바랍니다)!; 짜증나으로

나는 console.logconfirm 대화 상자를 교체!

+0

다른 클래스가 기대하는대로 외부 객체의 모든 속성을 필요로하지 않습니다. 그들이 거기에 ...) –

+0

objWrapper에'obj'를 전달하고 있습니다. 이렇게하면이 객체에 대한 참조를 잃지 않습니다. 필요한 경우 언제든지이 코드를 사용하여이 참조의 속성을 반환 할 수도 있습니다. – Karol

+0

하지만 obj.a는 끝에 정의되지 않았습니다. 맞습니까? –

1

개체와 기능을 서로 참조해야만 함수의 일부만 변경하면됩니다.

var obj = function() { 
    var x = function() {return x.f();}; 
    x.f = function() { return x.a + " " + x.b; }; 
    return x; 
}(); 

obj.a = "a"; 
obj.b = "b"; 

alert(obj()); 

이 기능을 변경하려면, 단지 obj.f 변경 :

obj.f = function() { 
    return obj.b + " " + obj.a; //swap the order. 
}; 

alert(obj()); 

편집 : 당신이 1 부에 액세스 할 수없는 것이라고 말했다 부분을 놓친 때문에,이 솔루션은 원 ' t 당신을 위해 일하지만, 여기에 다른 사람을 돕기 위해 남겨 두었고 obj()를 직접 사용할 수 있기 때문에 여기에 남겨 두었습니다.