Object.extend調査
関連
prototype.jsの調査による課題の列挙。
http://d.hatena.ne.jp/tsugehara/20060719/1153275663
一つ前
http://d.hatena.ne.jp/tsugehara/20060724/1153734243
解説
Object.extend = function(destination, source) { for (property in source) { destination[property] = source[property]; } return destination; }
以上。(笑)
いや、要するに全コピーしてるだけなのだが、destinationが初期化されていないので、全てのメンバが追加される動作になる点に注意。
元メンバにメンバを追加=Object.extendで継承を再現、というわけだ。
overrideについては検証していないしうろ覚えで申し訳ないが、確かECMAScriptは先定義優先だった気はするが、Object.extendは=で代入しているので全ては強制的にoverrideされることになると思われる。
わかりやすい例だとこの辺りだろうか。
function $H(object) { var hash = Object.extend({}, object || {}); Object.extend(hash, Enumerable); Object.extend(hash, Hash); return hash; }
$H関数というのは・・、
まず空のオブジェクトを作成する。これをAとする。
Aに引数(または空のオブジェクト)を追加して、さらにEnumerableとHashの機能を追加する。
この拡大作業で作成された列挙可能なオブジェクト、Aをreturnで返す。
これが$H関数の全てだ。
Object.extendによって名前から意味も伝わりやすいし、記述も簡略化される。
結論
- Object.extendはprototype.jsの便利関数
- base.jsの11行目以外で定義されているように見えたのは、Object.extendを使用しているところの勘違い。
2を間違えないようにするためには、オブジェクトリテラルに関する勉強が役に立つ。