javascript 프로토 타입 상속을 사용하여 DOM 요소에서 CSS 속성을 수집하는 다음 스 니펫을 고려하십시오. elem
배열은 DOM 노드에 해당하는 객체를 포함하고 각 객체는 style
필드를 가지며 각 elem[x].style
도 객체입니다. 그리고 elem[x].style
오브젝트는 __proto__
을 통해 연결된 DOM 트리 계층 구조를 반복합니다. rootStyle
변수는 모든 elem[x].style
프로토 타입 체인의 루트 역할 :브라우저에서 javascript __proto__를 자연스럽게 구현 된 알고리즘의 일부로 사용
var rootStyle = {},
elem = [{}, {}, {}];
rootStyle.__proto__ = null;
rootStyle.fontSize = '14px';
elem[0].style = {};
elem[0].style.__proto__ = rootStyle;
elem[0].style.fontWeight = 'bold';
elem[0].className = 'my-elem-123';
elem[1].style = {};
elem[1].style.__proto__ = rootStyle;
elem[1].style.fontStyle = 'italic';
elem[1].className = 'my-elem-456';
elem[2].style = {};
elem[2].style.__proto__ = elem[1].style;
elem[2].style.textDecoration = 'underline';
elem[2].className = 'my-elem-789';
...
// later in the code
var cssCode = [],
i, len = 3;
for(i = 0; i < len; i++) {
cssCode.push('.' + elem[i].className + '{' + getCssRules(elem[i]) + '}';
}
function getCssRules(elem) {
var result = [],
cssProperty, cssValue;
for(cssProperty in elem.style) {
// No hasOwnProperty check!
// Here (and in for..in loop) happens the lookup magic that I need
cssValue = elem.style[cssProperty];
result.push(cssValue + ':' + cssProperty + ';';
}
return result;
}
하고 여기 말했다 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto, 나는 때문에 성능에 미치는 영향의 객체의 프로토 타입을 변경하지 마십시오.
개체 키 - 값 조회는 내부적으로 많은 작업으로 바뀌지 만 어쨌든 관리되는 언어 일 수 있으며 여기의 모든 작업에는 오버 헤드가 있습니다. 그리고 미친 깊이의 프로토 타입 체인을 만들지 않으면 프로토 타입 체인 조회의 속도가 "단일 단계"작업의 속도와 비슷해야합니다. 즉 O (1)의 복잡성에 가깝습니다. 그리고 내 algorythm 자연스럽게 그런 행동으로 데이터 구조가 자연스럽게 필요한 경우 엉덩이에 고통 - 내 자신의 체인 조회 또는 일부 완전히 다른 솔루션을 구현하는 "단지 __proto__
나쁜"때문입니다.
그렇다면 __proto__
의 경우 또는 좋거나 나쁜 용도는 무엇입니까?
elem
배열에 실제 DOM 노드에 대한 참조를 저장하는 경우 무슨 일이 일어날 지
:
elem[0].domNode = document.body.childNodes[0];
elem[1].domNode = document.body.childNodes[1];
elem[2].domNode = elem[1].domNode.childNodes[0];
나쁜, 좋은 아니면, 중요하지 않습니다 사용자 정의 프로토 타입 체인에 객체를 연결하고, 개체 일반적인 프로토 타입 체인, 여기서 엔진의 최적화가 실패합니까?
: 이제 알았습니다. __proto__
설정과 관련된 모든 혼란은 정확하게 __proto__
참조를 변경하는 것입니다. 그것은 나쁜 것을 유발합니다 (첫번째 코멘트의 링크를보십시오). 우리는 받아 들여진 응답의 구문을 고수해야합니다. 첫째로 나는 나쁜 것들이 빈 프로토 타입 자체 때문에 발생한다고 생각했다. 최적화를 위해 자바 스크립트 엔진에 필요한 멤버가 부족했다.
[왜 성능에 좋지 객체의 프로토 타입을 돌연변이인가? (에 허용 대답 http://stackoverflow.com/questions/23807805/why-is-mutating-the-prototype-of-an -object-bad-for-performance)에는 관심이있을만한 정보와 따옴표가 있습니다. – noppa