javascript Object.createについて

with コメントはまだありません

いろいろjsの本やサイトを見てるとやたらnewの使用について
言及されていることに気付く。
newはオブジェクトをインスタンス化する際に使われるものですが、
newとは本来、クラスをインスタンス化するものであって、
実際、javascriptではクラスという概念は他の言語とちと
ちがうらしくクラスライクな考えをなぞらえているだけらしい。
詳しくはわからないけどともかくnewを使うにはそれなりに
気を使うべきであり、ベストは使わないべきともすら言われている。
そこで新たに定義された仕様でObject.createというものがある。

[javascript] var o = Object.create(Object.prototype, {
name : {value: "aaa"},
bar: { value : function() { return this.name }}
});
[/javascript]

こんな感じでオブジェクトを作成できる。
valueってのは決まり文句の模様。
あとは普通のオブジェクトと一緒でo.name,o.bar()で
取得可能。

んで問題は継承やメソッドの追加。
newがつかえたときは
o.prototype.name2 = “bbb”;
とかで行けたんだけどどうやらこれはできないみたい。
(詳しくはよくわからん・・・)
いろいろやってみて下記でできた。
[javascript] var o = Object.create(Object.prototype, {
name : {value: "aaa"},
bar: { value : function() { return this.name }}
});
var p = Object.create(o, {
name2 : {value: "bbb"},
bar2: { value : function() { return this.name2 }}
});
console.log(p.name2+":"+p.name);
[/javascript]

Object.createの第一引数にはプロトタイプの元となるオブジェクトを
指定できるとマニュアルに書いてあったので、oを入れてみた。
第二引数には新たに設定したい初期プロパティを入れれるので、
新しいのを入れてみた。それをpに入れてみたらちゃんと、
どちらのメソッド、プロパティも保持したオブジェクトができた。

ただ本当にこれでよいのか・・・
誰か教えてください。。

//追記

一度作成したオブジェクトに対して、
新たにプロパティを付け加える方法。
newを使っていたころは、
obj.prototype.hoge = “つけたいプロパティ”;
でできたんですが、create();で作成したものは
上記方法ではできないので
Object.definePropertiesなるものを使うようです。
すでに作成したobjectに対して
[javascript] Object.defineProperties(o, {
hoge: {
value : "aaaaa",
},
test: {
value : function() {
return this.hoge
}
}
});
[/javascript] これで、oには値が二つのメソッドが二つ、
計4つのプロパティが設定されたことになります。

当然、pオブジェクトにも継承されているので、
p.test()などで呼び出すことも可能。

便利ね。

Leave a Reply