네, 이것은 기본적으로 Prototype의 주요 문제점입니다.
프로토 타입은 다른 브라우저에서 다르게 작동합니다. HTMLTableRowElement와 같은 호스트 객체의 프로토 타입을 가지고 플레이 할 수있는 브라우저에서는 과 같은 자체 함수를 프로토 타입에 추가하므로 <tr>
을 보유 할 때마다 해당 메소드를 직접 호출 할 수 있습니다. 우우, 얼마나 편리합니까!
DOM 노드의 프로토 타입을 변경할 수 있다는 것은 ECMAScript 또는 DOM 표준이 실제로 보증하지 않는 것입니다. 모질라는 이런 식으로 멋지 기 때문에 파이어 폭스에서 작동하지만 모든 브라우저에서 작동 할 것이라고 기대할 수는 없습니다. 그것은 IE에서 확실히 작동하지 않을 것입니다. 모든 브라우저에서 안전하게 this.toggleClassName
를 호출 할 수 있습니다 지금
Element.extend(this);
:
그래서 다른 브라우저에 대한 당신과 함께 ('오그')를 추가하면 처리 할 모든 단일 개체 위에 자신의 방법을 프로토 타입 말할 필요 .
특정 <tr>
을 추가하면 나중에 액세스 할 때마다 여전히 기능이 향상되므로 toggleClassName
을 계속 호출 할 수 있습니다. 또한 Prototype 메소드 (예 : $('mytrid')
)를 통해 요소에 액세스하면 자동으로 기능이 향상됩니다.
이것은 편리한 기능이 아닙니다. 이것은 함정입니다. 브라우저에서 작동하는 코드 (프로토 타입 해킹을 지원함)를 작성할 것을 권장하지만 다른 곳에서는 실패 할 수 있습니다. 특정 순서로 페이지 요소와 상호 작용할 경우 작동하는 코드를 작성하여 증분 된 메소드가 호출되기 전에 모든 요소가 증가하도록 보장하지만 다른 순서로 요소와 상호 작용하면 넘어지게됩니다.
이것은 디버깅 재앙이며 Prototype을 사용하지 않는 이유입니다.
(다음 주에는 불꽃 놀이를 즐기기 위해 왜 jQuery를 사용하지 않습니까?)
그래서 Prototype을 사용하는 것을 중단 한 이유는 무엇입니까?하지만 항상 $ (this) .whatever()를 사용하면 Prototype은 이미 펼친. 이렇게하면 특정 순서대로 발생하는 것에 대한 의존도를 줄일 수 있습니다. –
좋아, 내가 물어볼 테니 (이 주제는 아니지만) jQuery를 사용하지 않으시겠습니까? 나는 너를 화나게하지 않을 것을 약속한다 .-) –
고마워! 나는 아직 100 % 이해하지 못한다. 그러나 그것은 트릭을했다! –