2010-07-02 4 views
7

JSON으로 정의 된 기존 객체의 배열이 있습니다. 개체는 분명히 Object 유형입니다. 특정 기능을 제공하기 위해 사용자 정의 오브젝트 유형과 연관시키는 방법은 무엇입니까?JavaScript에서 객체 유형 변경

+0

그 객체가 추가 속성이있는 경우/방법, 당신은 무엇을 더 필요로합니까? 몇 가지 예를 들어 주시겠습니까? – mykhal

+0

.. 내 말은, 당신은 이미 정의 된 그러한 커스텀 객체 유형을 가지고 있는가? 아니면 그것을 수행하는 방법을 알고 싶습니까? – mykhal

답변

11

모든 브라우저에서 작동합니다 방법은 당신이 원하는 속성과 방법과 배열의 각 항목을 확대 또는 생성자에 개체를 전달하고 기존 객체의 기반으로 새 개체를 만드는 중입니다 속성 및 메서드. 당신이 IE에 대해 걱정하지 않는 경우

또는 :

var obj = { 
    name : "Jeremy" 
}; 

function CustomType() { 
    this.name = this.name || "someValue"; 
    this.greeting = "Hi"; 
} 

CustomType.prototype.sayHi = function() { 
    alert(this.greeting + ", " + this.name); 
}; 

obj.__proto__ = CustomType.prototype; 
obj.constructor.call(obj); 

obj.sayHi(); 
+1

저는 IE에 대해 신경 쓰지 만, 제안 된 바에 따라 전달 된 객체를 수정하고 호출자에게 다시 반환하는 메소드를 작성했습니다. 필자는 Perl에서 "축복"을 사용하고 내 호기심에 따라 객체를 수정할 수있는 데 너무 익숙합니다. – Ray

4

개체를 만든 후에는 개체의 형식을 변경할 수있는 방법이 없다고 생각합니다. 다행히도 클래스의 객체를 실제로 변경할 필요는 없을 것입니다. 객체에 몇 가지 새로운 메소드와 다른 기능을 제공하는 것에 만족할 것입니다. (유일한 차이점은 클래스를 변경 한 경우 발생할 수있는 일이며 코드가 실행되는 동안 대부분의 사람들은 클래스를 변경하지 않는다는 의미입니다.)

예를 들어 설명해 드리겠습니다.

function Speaker() { 
    this.speak = function() { 
     window.alert("Hello, " + this.name); 
    } 
} 

이 :

var myobj = new Object() 
myobj.name = "Fred" 

그럼 난 당신이 myobj에 할당 할 수 있도록하고 싶습니다 몇 가지 클래스를 생성합니다 : 첫째, 당신이 가지고있는 JSON 객체를 표현하는 간단한 객체를 만듭니다 새로운 Speaker 클래스는 몇 가지 유용한 기능이 있습니다 :

var s = new Speaker() 
s.name = "Sally" 
s.speak() 

이 그 m를 준 실행 : 그것은 출력 유용한 정보에 방법을 speak() 사용할 수 있습니다 e 메시지 "여보세요, 샐리". 불행히도이 기능을 가진 NEW 객체 (예 : s)를 원하지 않는다면 기존 객체 (myobj)가 갖고 싶어합니다. 다음은 당신이 어떻게 :이 실행 이제

myobj.speak = s.speak 

:

myobj.speak() 

라는 메시지가 "안녕하세요, 프레드"를 참조하십시오.

요약하려면 다음을 입력하십시오. 원하는 것을 수행하는 오브젝트를 작성하십시오. 모든 메소드 (및 임의의 도우미 변수)를 새 오브젝트로 복사하십시오. 비정상적인 상속 사용을 제외하고는 새로운 객체가 원하는대로 동작합니다.

2

특정 메소드를 사용하려면 apply/call을 사용할 수 있습니다.

또는 사용자 지정 개체의 메서드를 복사 할 수 있습니다.

function Object1() { 
    this.aValue = "10"; 
} 

function CustomObject() { 
    this.customValue = "6"; 
} 

function convertToCustom(obj) { 
    var custom = new CustomObject(); 
    for(var key in obj) { 
    custom[key] = obj[key]; 
    } 
    return custom; 
} 

var obj = new Object1(); 
var custom = convertToCustom(obj); 

console.log(custom.customValue); // <- 6 
console.log(custom.aValue);  // <- 10 
0

를 제레미의 대답을 보완, 당신은 직접 프로토을 가지고 노는 대신 Object.create를 사용할 수 있습니다. 또한 "확장"기능이 필요합니다.

그래서, 제레미의 예를 주어, 당신은 다음과 같이 할 수 : 당신이 생성자가 필요하지 않은 경우

var obj = { 
name : "Jeremy" 
}; 


function CustomType() { 
} 

CustomType.prototype.init = function(){ 
    this.name = this.name || "someValue"; 
    this.greeting = "Hi"; 
    return this; //let's make it fluent 
} 

CustomType.prototype.sayHi = function() { 
    console.log(this.greeting + ", " + this.name); 
}; 

function extend(obj, props) { 
    for(prop in props) { 
     if(props.hasOwnProperty(prop)) { 
      obj[prop] = props[prop]; 
     } 
    } 
    return obj; //let's make it fluent 
} 

obj = extend(Object.create(CustomType.prototype), obj).init(); 

obj.sayHi(); 
1

, 당신이 할 수있는이 같은 :

Object.assign(new CustomType, {});