ここでは、javascriptのプロトタイプ継承を使用してDOM要素からCSSプロパティを収集しています。 elem
配列はDOMノードに対応するオブジェクトを含み、各オブジェクトはstyle
フィールドを持ち、各elem[x].style
もオブジェクトです。 elem[x].style
オブジェクトはDOMツリー階層を繰り返し、__proto__
で接続されています。 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)の複雑さに近くなります。私の忠誠心が、そのような振る舞いを持つデータ構造を必然的に必要とするならば、 "__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__
のリファレンスを変更することです。それは悪いことを引き起こします(最初のコメントのリンクを参照)。私たちは本当に受け入れられた答えの構文に固執すべきです。まず、空のプロトタイプそのものが原因で悪いことが起こり、最適化のためにjavascriptエンジンに必要なメンバーが不足していると私は考えました。
[なぜ性能の悪いオブジェクトのプロトタイプに変異があるのですか?](http://stackoverflow.com/questions/23807805/why-is-mutating-the-prototype-of-an -object-bad-for-performance)には、興味のある情報と引用があります。 – noppa