JavaScript デス

このエントリーをはてなブックマークに追加
私は、JavaScriptはプロトタイプベースの言語なんだから、instanceof による
型チェックとか、継承もどきとかは、やってもしょうがないと思っている。

__proto__ プロパティが標準だったら、これを使って、それぞれのインスタンスが
自由に委譲をしあえばそれで済むはずなんだ。
コンストラクタなんかいらない。

それにしても、何でこれが標準にならなかったんだろう。
プロトタイプにコンストラクタからしかアクセスができないのは、不自由で
しょうがない。
例えばこんな感じ。

//これは今回、あるオブジェクトのプロトタイプになるが、
//別にコンストラクタでもなんでもない、ただのオブジェクト。
var a = {};
a.showObjectType = function(){ alert(this) };

//a1 は関数型のオブジェクト。
var a1 = function(){ alert("hoge") };

//a の機能を借りるために、a1のプロトタイプを a にする。
a1.__proto__ = a;

a1.showObjectType(); // [object: Function] と表示。

a1();// a1 は実行可能で"hoge" と表示する。
続き。

//別のインスタンスを生成。
var b = {};
b.showObjectType = function(){ alert(Function.prototype.toString.apply(this)) };

//b の機能を借りる。
a1.__proto__ = b;
a1.showObjectType(); // function(){alert("hoge")}と表示。

// instanceof はもう諦める。というより、そういうのを使わない方針で書く。

こんなんでどうよ?
いいんじゃないの。
>>691
いいと思うだろう?何で標準にならなかったのかねえ。

「プロトタイプベース・オブジェクト指向」スレで
「効率の問題だ」と言ってた人がいるけど、あんまりそうとは思えない。
プロトタイプを隠しプロパティにしようがするまいが、プロトタイプ・チェーンの
検索に必要な時間は変わらないだろう?

ということで、わざわざ隠しプロパティにしている理由がわからん。
693デフォルトの名無しさん:04/02/01 23:18
変更不可ならキャッシュできるから有利なんじゃないかな。
>>693
なるほど、一度ヒットしたプロパティをキャッシュしておくのか…。

確かにその可能性はあるかもしれない。条件にもよるけど、IE のスクリプト
エンジンのほうが、Mozilla の SpiderMonkey より速いんだよね。

他にも何か問題は無いかな?
循環参照の問題があると思う。

var a = {};
a.__proto__ = a;// エラー:cycric __proto__ value

プロトタイプをコンストラクタからしかアクセスできないようにすれば、
循環参照は絶対に起こらない。
チェックの必要がなくなるから、効率を高めると思う。
>>695
__proto__ が無くても循環参照は起きるんじゃないの?

var A = new Function, B = new Function, C = new Function;
A.prototype = B;
B.foo = function(){alert("foo!")};
B.prototype = C;
C.bar = function(){alert("bar!")};
C.prototype = A;

…と思ったら、エラーは起きませんでした。
と言うか、A は B を継承しているけど、C は継承できてない。なぜ?

var a = new A();
a.foo(); //"foo!"
a.bar(); //エラー:a.bar is not a function
あ、エラーは起きませんでした、というのは、循環参照エラーは起こらなかった、
という意味です。別のエラーは最終行で起こった。
>>696
仕様ぐらい嫁よ