2010-11-28 3 views
0

내 응용 프로그램에서는 JSON으로 주석 모음을받습니다.많은 요소에 동일한 함수 추가 (js 프로토 타입을 사용 하시겠습니까?)

그런 다음,이 컬렉션의 모든 항목에 기능을 추가 할, 그래서 예를 들어 코멘트 comment.first_name 가지고 comment.last_name, 나는 comment.full_name()을 구축하고자합니다.

지금까지 내가하고 있어요 : (이보다 더 복잡하고 다른 방법) 많은 의견이 있기 때문에

comment.full_name = function() { return this.first_name+" "+this.last_name } 

내 질문은 내가 프로토 타입 또는 생성자을 사용할 수있는 방법이다 각 요소에 삽입하지 않고 컬렉션의 모든 항목에 동일한 함수를 추가 하시겠습니까?

편집 : 나는

comments[1].name() //=> John Silver 
comments[2].name() //=> Jack Sparrow 

답변

1

직접 질문에 답하려면 문자로 을 붙이면을 붙여서 객체의 프로토 타입에 붙이면 prototype 키워드가있는 프로토 타입 체인입니다. comment 객체의 프로토 타입에 기능, full_name()를 연결하려면, 당신은 같은 것을 할 것입니다 :

comment.prototype.full_name = function() { 
    if (typeof(this.first_name) !== "undefined" && typeof(this.last_name) !== "undefined") { 
    return this.first_name + " " + this.last_name; 
    } else { 
    return "" 
    } 
}; 

편집 :

위의 코드뿐만 아니라 상황에 작동합니다. JSON 객체의 각 값에 full_name 속성을 첨부합니다. full_name은 함수입니다. 두 속성이 모두 undefined이 아닌 한 현재 개체의 first_name 속성, 공백 및 현재 개체의 last_name 속성을 포함하는 연결된 문자열을 반환합니다. 둘 중 하나 또는 모두가 있으면 empty string을 반환합니다.

+0

위대한, 그게 내 질문을 해결해! 그러나 주석을 제외한 모든 객체에이 메소드를 추가하지 않겠습니까? 나는 그 메소드 만 주석에 추가하고 싶습니다. (각 주석을 편집 할 때) 그 객체 만 프로토 타입을 가져야한다고 지정하면 완벽 할 것입니다. – micho

+0

@micho 사과 하긴하지만 모든 물건으로 무슨 뜻인지 잘 모르겠다. 위의 코드는'full_name' 함수를 모든 주석 객체에 첨부하고 * only *를 모든 주석 객체에 첨부합니다. 어쩌면 질문을 수정하여 원하는 것을 정확하게 * 정확하게 * 지정할 수 있습니까? – Alex

+0

@Alex. 여기에 코멘트 유형이 있는지 확실하지 않습니다. 방금 JSON 파서에서 튀어 나왔습니다. – spender

1

JSON은 캡슐화하지 않는 점을 감안 돌려 무언가를 찾고 있어요, 지금

comments = ({"1": {"first_name":"John", "last_name":"Silver"}, "2": {"first_name":"Jack", "last_name":"Sparrow"}}) 

: 여기

코드의 예입니다 형식에 대한 정보가 있으면 객체 프로토 타입에 메서드를 추가하지 않고도 일반적으로이 작업을 수행 할 수 있는지 확신 할 수 없습니다. 이것이 바람직한 지 여부는 논쟁의 대상이됩니다. JSON 구문 분석기에서 데이터를 얻은 후에는 한 번에 하나씩 객체를 펀치하는 것이 좋습니다 (현재 수행중인 것처럼 보입니다).

+0

하지만 더 많은 메모리를 비교하지 않겠습니까? 나는 각 코멘트에 대한 constructor 요소를 대체하고 모든 프로토 타입을 공통적으로 사용하려고 생각하고 있었지만 어떻게해야하는지 전혀 모른다. – micho

+0

메모리 소비? – spender

+0

oops, 그게 내가 의미했던 것입니다 :) 더 많은 메모리를 소비합니다. – micho

관련 문제