2008-09-23 6 views
33

JavaScript에서는 함수를 객체로 처리 할 수 ​​있습니다. 변수를 함수로 처음 정의하면 해당 함수에 속성을 추가 할 수 있습니다. 그 반대로 어떻게 "객체"에 함수를 추가합니까?"객체"를 JavaScript의 함수로 변환하는 방법은 무엇입니까?

이 시점에서
var foo = function() { return 1; }; 
foo.baz = "qqqq"; 

, foo()이 함수를 호출하고, foo.baz는 값 "QQQQ"가 :

이 작동합니다.

그러나 먼저 속성 할당 부분을 수행하면 함수에 변수를 어떻게 할당합니까?

var bar = { baz: "qqqq" }; 

나는 값 "QQQQ"bar() 함수를 호출 할을 가지고 bar.baz을 준비하기 위해 지금 무엇을 할 수 있는가?

+0

내가 할 필요성을 이해하지 못하는 이. 당신이 달성하고자하는 것에 대한 구체적인 예를 들어 줄 수 있습니까? – Geoff

+1

두 번째 형식에 대한 사용을 지금 당장 생각할 수 없습니다. 첫 번째는 정적 변수에 다소 유용합니다 (클로저에서도 마찬가지입니다). 속성을 복사하지 않고 성취 할 수있는 방법을 생각할 수 없기 때문에 대부분 부탁합니다. 병렬 형식이므로 불행합니다. – mjs

+0

Javascript 개체에 메서드를 할당 할 수 있기 때문에 연산자 오버로드를 할당 할 수도 있습니다. 나는 자바 스크립트를 모른다. 그래서 답을 모르지만, 행운을 빌어 요. ... –

답변

26

여기에 혼동하기 쉽지만 (쉽게 또는 분명하게 또는 내가 너) 원하는대로해라. 바라기를 이것은 명확한 일을 도울 것입니다.

먼저 Javascript의 모든 객체는 Object 객체에서 상속받습니다.

//these do the same thing 
var foo = new Object(); 
var bar = {}; 

둘째, 자바 스크립트에서 개체 기능. 특히 그들은 Function 객체입니다. Function 객체는 Object 객체에서 상속받습니다. 당신은 당신이하지 (쉽게 또는 명확하게 또는 내가 아는 한) Function 객체로 변환 할 수있는 "개체"로 변수를 선언되면 Function constructor

var foo = new Function(); 
var bar = function(){}; 
function baz(){}; 

를 체크 아웃. 함수 유형 (함수 생성자와 함께 변수를 익명 함수 등으로 지정)의 새 Object를 선언하고 이전 객체의 메소드 속성을 복사해야합니다.

마지막으로 가능한 질문을 예상하여 함수로 선언 된 경우에도 functionBody/source를 (내가 아는 한) 변경할 수 없습니다.

+2

소스를 변경할 수는 없지만 CAN은 언제든지 기능을 다시 정의 할 수 있습니다 (예 : 덮어 쓰기). – scunliffe

+0

모든 개체는'Object.prototype'에서 상속받습니다 (명시 적으로 다른 개체로 설정되지 않은 경우). 함수 객체는'Function.prototype'에서 상속받습니다. –

0

자바 스크립트 함수가 객체로 취급 될 수 있습니다 - 당신이 함수에 속성을 추가 할 수 있습니다. 그 반대의 작업을 수행하고 개체에 함수를 추가하려면 어떻게해야합니까?

조금 혼란스러워 보입니다. JavaScript의 함수 인 개체입니다. 변수 변수입니다. 당신은이 작업을 기대하지 않을 것이다 :

var three = 3; 
three = 4; 
assert(three === 3); 

... 왜 당신이 당신의 변수에 함수를 할당하는 어떻게 든 이전 값을 유지 것이라고 기대? 아마도 몇 가지 특수 효과가 당신을위한 것들을 명확히 해줄 것입니다 :

// assigns an anonymous function to the variable "foo" 
var foo = function() { return 1; }; 
// assigns a string to the property "baz" on the object 
// referenced by "foo" (which, in this case, happens to be a function) 
foo.baz = "qqqq"; 
+0

정확하게 내 대답에 대한 그의 의견을 참조하십시오. 나는 그가 조금 잃어 버렸다고 생각합니다. –

+1

원래 질문의 두 번째 과제는 혼란 스러웠습니다. 나는 이것을 지금 제거했다. 'bar = {baz : "qqqq"}'뒤에'bar()'가 함수로 호출 할 수 있도록 어떻게 준비 할 수 있습니까? – mjs

+0

그렇지 않습니다. * 함수가 아닌 * 객체를 할당했습니다. 처음부터 다시 시작하거나 (함수를 할당 할 수 있습니다.) 또는 자신의 인생을 살아갈 수 있습니다. – Shog9

20

표준 방법이없는 것처럼 보이지만 작동합니다.

그러나 질문은 무엇입니까?

function functionize(obj , func) 
{ 
    out = func; 
    for(i in obj){ out[i] = obj[i]; } ; 
    return out; 
} 

x = { a: 1, b: 2 }; 
x = functionize(x , function(){ return "hello world"; }); 
x() ==> "hello world" 

은 단순히 이

x={} 
x() 

는 "유형의 오류"를 반환하고이 acheive하는 다른 방법은 없습니다. "x"는 "객체"이기 때문에 변경할 수 없습니다. 하려고하는 것만큼이나 분별있는 것

x = 1 
x[50] = 5 
print x[50] 

그것은 작동하지 않을 것이다. 1은 정수입니다. 정수에는 배열 메소드가 없습니다. 너는 그것을 만들 수 없다.

+5

왜이 작품은 전혀 신비가 아닙니다. x를 함수로 바꾸는 것뿐입니다. –

+0

그래,하지만 이것은 또한 x를 함수로 바꾸기 전에 함수에'x'의 모든 속성을 복사합니다. "내가 왜 대답 했으니 까?"라는 질문에 "왜 함수가 객체가 약간 혼란 스럽습니다"라고 생각 하긴하지만 –

1

임시 변수 사용

:

for (var p in bar) { xxx[p] = bar[p]; } 

마침내 원래의 변수에 기존의 특성과 새로운 기능을 다시 할당 :

var xxx = function()... 

은 다음 원래 객체의 모든 속성을 복사를

bar = xxx; 
-1
var bar = { 
    baz: "qqqq", 
    runFunc: function() { 
     return 1; 
    } 
}; 

alert(bar.baz); // should produce qqqq 
alert(bar.runFunc()); // should produce 1 

나는 이것을 찾고 있다고 생각합니다.

function Bar() { 
    this.baz = "qqqq"; 
    this.runFunc = function() { 
     return 1; 
    } 
} 

nBar = new Bar(); 

alert(nBar.baz); // should produce qqqq 
alert(nBar.runFunc()); // should produce 1 
+0

이것은 원래의 객체를 실행 가능한 함수로 변환하는 방법 인 원래의 질문에는 전혀 접근하지 않습니다. 귀하의 대답은 단순히 기능을 객체의 속성으로 지정합니다. – krb686

2

개체 유형의 기능이며, 객체 자체가 기능하게 실체화 :

도 같이 쓸 수 있습니다. (파이어 폭스)

javascript:alert([Array, Boolean, Date, Function, 
         Number, Object, RegExp, String].join('\n\n')) 

표시 :

function Array() { 
    [native code] 
} 

function Boolean() { 
    [native code] 
} 

function Date() { 
    [native code] 
} 

function Function() { 
    [native code] 
} 

function Number() { 
    [native code] 
} 

function Object() { 
    [native code] 
} 

function RegExp() { 
    [native code] 
} 

function String() { 
    [native code] 
} 

특히 함수 객체 function Function() { [native code] }를 참고 (재귀 정의 자체를 사용하여) 점화식으로 정의된다.

또한 answer 124402#1244021[50]=5과 관련하여 불완전합니다. 이것은 Number 객체에 속성을 지정하고 유효한 Javascript입니다.

javascript: 
    alert([ [].prop="a", true.sna="fu", (new Date()).tar="fu", 
        function(){}.fu="bar", 123[40]=4, {}.forty=2, 
         /(?:)/.forty2="life", "abc".def="ghi" ].join("\t")) 

표시

a fu fu bar 4 2 life ghi 

해석하고 자바 스크립트의 "규칙 참여의"에 따라 제대로 실행

, 관찰한다.

물론 항상 주름이 있으며 =으로 표시됩니다. 객체는 변수에 할당 될 때 본격적인 개체 대신 값으로 "단락"됩니다.이는 부울 객체 및 부울 값에 대한 문제입니다.

명시 적 개체 식별이이 문제를 해결합니다.

javascript: x=new Number(1); x[50]=5; alert(x[50]); 

는 "과부하"아주 합법적 인 자바 스크립트 운동이며, 코드 난독 화는 위험 할 수 있지만 명시 적으로 prototyping 같은 메커니즘을 승인.

최종 참고 :

javascript: alert( 123 . x = "not" ); 

javascript: alert((123). x = "Yes!"); /*()'s elevate to full object status */ 
1
var A = function(foo) {                          
    var B = function() {                          
    return A.prototype.constructor.apply(B, arguments); 
    }; 
    B.prototype = A.prototype;                         
    return B;                             
}; 
+7

정확히 무엇을하고 있습니까? – netpoetica

0

NB : 댓글 올리기이 문제를 해결하는 방법의 스타일에 작성합니다. 나는 그것이 OP의 경우에 사용할 수 있는지 100 % 확신하지 못합니다.

서버에서 생성되어 JSON/ajax를 통해 클라이언트에 전달 된 객체를 변환하는 방법을 찾는 중에이 게시물을 발견했습니다.

OP에서와 마찬가지로 클라이언트로 인스턴스를 생성 할 수 있도록 함수로 변환하려는 객체와 동일한 상황에서 효과적으로 나를 버렸습니다. 결국

내가 (지금까지 이상) 작동되는이 함께했다 : 나는 실제로 원하는 내 경우

var data = { _type: "Example", foo: "bar" }; 
parentObject.createFunc(data); 
var instance = new parentObject.Example(); 

: 다음처럼 사용할 수 있습니다

var parentObj = {} 

parentObj.createFunc = function (model) 
{ 
    // allow it to be instantiated 
    parentObj[model._type] = function() 
    { 
     return (function (model) 
     { 
      // jQuery used to clone the model 
      var that = $.extend(true, null, model); 
      return that; 
     })(model); 
    } 
} 

결과 객체 인스턴스와 관련된 함수를 가지며 인스턴스화 할 때 매개 변수를 전달할 수도 있습니다.

그래서 내 코드이었다 :

var parentObj = {}; 
// base model contains client only stuff 
parentObj.baseModel = 
{ 
    parameter1: null, 
    parameter2: null, 
    parameterN: null, 
    func1: function() 
    { 
     return this.parameter2; 
    }, 
    func2: function (inParams) 
    { 
     return this._variable2; 
    } 
} 

// create a troop type 
parentObj.createModel = function (data) 
{ 
    var model = $.extend({}, parentObj.baseModel, data); 
    // allow it to be instantiated 
    parentObj[model._type] = function(parameter1, parameter2, parameterN) 
    { 
     return (function (model) 
     { 
      var that = $.extend(true, null, model); 
      that.parameter1 = parameter1; 
      that.parameter2 = parameter2; 
      that.parameterN = parameterN; 
      return that; 
     })(model); 
    } 
} 

를 그리고 이렇게 불렀다 :

// models received from an AJAX call 
var models = [ 
{ _type="Foo", _variable1: "FooVal", _variable2: "FooVal" }, 
{ _type="Bar", _variable1: "BarVal", _variable2: "BarVal" }, 
{ _type="FooBar", _variable1: "FooBarVal", _variable2: "FooBarVal" } 
]; 

for(var i = 0; i < models.length; i++) 
{ 
    parentObj.createFunc(models[i]); 
} 

을 그리고 그들이 사용할 수 있습니다

var test1 = new parentObj.Foo(1,2,3); 
var test2 = new parentObj.Bar("a","b","c"); 
var test3 = new parentObj.FooBar("x","y","z"); 

// test1.parameter1 == 1 
// test1._variable1 == "FooVal" 
// test1.func1() == 2 

// test2.parameter2 == "a" 
// test2._variable2 == "BarVal" 
// test2.func2() == "BarVal" 

// etc 
관련 문제