2012-10-01 5 views
1

많은 XML 조작이 포함 된 HTML5 응용 프로그램을 작성 중입니다.이 조작의 일부는 두 개의 서로 다른 XML 요소의 버전 비교를 포함합니다.Element에서 상속받은 객체를 "올바르게"만드는 방법은 무엇입니까?

내가 필요한 요소는 모든 버전의 정보를 포함하도록 생성되었지만 일반 Element, Attr 또는 여전히 동작 할 수있는 모든 Element, Attr 및 TextNode (모두 Node, AFAIK에서 상속) 객체입니다. TextNode. 내가 내장 기능 보강하는 것이 유형의 나쁜 형태로 간주됩니다 이해, 이제

Node.prototype.MyAppAnnotation = { 
     Version : null 
}; 

하지만,이 기술을 넘어, 난 손실에 있어요 : 나는 버전 정보를 저장하는 데 사용하고 현재 작업 솔루션은 다음과 같다 원하는 기능을 얻는 방법. 나는 래퍼에 노드 관련 프로퍼티와 함수가 필요하기 때문에 래퍼에 노드를 캡슐화 할 수 없다고 생각한다. 래퍼에 대해 일종의 통과 함수를 작성할 수는 있지만 실제로는 어색해 보입니다.

내가 쓰고있는 앱이 HTML5 앱이기 때문에 이러한 기능은 가장 최신 브라우저 (모두 내장 기능을 지원함)에서 실행되어야하기 때문에이 기술이 적절하다고 느낍니다. 또한 내 보강 오브젝트에 충분히 모호한 이름을 제공하여 모든 이름 지정 충돌 (의도적 충돌 제외)을 피할 수 있습니다. 또한 Google의 Closure 라이브러리를 사용하여 상속 기반 솔루션을 살펴 보았습니다. 그러나 Element, Node 및 TextNode에는 직접 생성자가 없으므로 (즉, Document 객체로 생성 됨)이 기술은 작동하지 않습니다.

누군가가 a) Element를 보강하지 않고이 효과를 얻는 우아한 방법을 제안하거나 b) 왜 "기본 제공 기능을 늘리지 마십시오"규칙을 위반해서는 안되는지에 대한 설득력있는 이유를 제시 할 수 있는지 궁금합니다. 이 경우에.

많은 덕분에, Jarabek

답변

1

당신의 생각은 이론적으로 유효하지만 그것에 대해 읽을 때 내가 얻을 이상한 느낌이있다.

먼저 무엇보다 프로토 타입을 늘릴 필요가 없습니다. somedomnode.myweirdname='foo'을 수행하면 해당 개체의 필드가됩니다. 그건 javascript가하는 것입니다.) 버전이 없으면 null 대신 undefined가 나타납니다.

그러나 더 많은 기능을 추가하거나 dom 노드를 감추고 싶다면 - 그 일을하는 데 약간의 역사가 있습니다. 그 역사의 대부분은 jQuery와 같은 것들에 의해 지배됩니다 :)

단지 노드를 포함하는 필드를 가진 객체를 만듭니다. '= somedomnode.myweirdname :

myobject.node

을 그리고 어떤 생성자하거나 공장 함수 개체를 만드는 : 그리고 당신은 정말 간단하게 액세스 할 수 있습니다

var myobject = createDomNodeWrapper(domnode)

+0

첫 번째 예에 대한 질문 foo '; 노드를 만들 때마다이 작업을 수행해야합니까? 내 애플 리케이션의 여러 다른 지점에서 요소, 노드 및 Attrs를 만들고, 그 프로토 타입을 수정하여, 그 번거 로움을 저장할 수있는 것 같습니다. – jarabek

+0

그렇다면 프로토 타입에 필드를 추가하면 각 요소에 대해 필드를 일부 값으로 설정하려고하기 때문에 버전 관리 아이디어를 완전히 이해하지 못합니다. 프로토 타입에 값을 한 번 설정하고 프로토 타입에서 나중에 값을 변경하면 모든 인스턴스가 변경됩니다 (예전 인스턴스 포함).그렇다면 모든 요소에 대해 설정하거나 모든 요소에 대해 동일한 값을 지정하면 번거 로움을 덜 수 있습니다. – naugtur

+0

나는 당신이 무엇을 얻고 있는지 보았습니다. 당신의 설명은 지금 훨씬 더 이해가됩니다. 감사. – jarabek

관련 문제