11、prototypeで既存のオブジェクトを修正し、バインディングサポートを遅くする
1406 ワード
プロトタイプの属性で既存のクラスのために新しい方法を定義することができます.自分のクラスを処理するように.現在はNumberに16進の方法を追加します.
遅いバインディングのサポート
技術的には、極めて遅いバインディングは存在しない.しかし、javaScriptは対象を実用化してからその方法を定義することができます.たとえば:
Number.prototype.toHexString = function(){
return this.toString(16);
}
var iNum =15;
alert(iNum.toHexString());//f
ECMAScriptの各ローカルオブジェクトに新しい方法を追加するには、Objectオブジェクトのprototype属性で定義する必要があります.上記の章で述べたように、すべてのローカルオブジェクトはObjectオブジェクトを継承していますので、Objectオブジェクトを変更すると、すべてのローカルオブジェクトに反応します.例えば、警告出力対象の現在の値を追加する方法では、以下のコードが使用されてもよい.Object.prototype.showValue=function(){
alert(this.valueOf());
}
var str = 'hello';
var iNum=25;
str.showValue();//hello
iNum.showValue();//25
ここでは、StringオブジェクトとNumberオブジェクトは、ObjectオブジェクトからshowValueメソッドを引き継ぎ、それぞれのオブジェクトにこの方法を呼び出して、「hello」と「25」を表示します.既存のクラスに新しい方法を定義できるように、既存の方法を再定義することもできます.現在Function類のtoString()関数に書き換えて、元のtoString()はFunctionに戻るソースコードです.var fun = function(){
return 1;
}
alert(fun.toString());//
Function.prototype.toString = function(){
return 'code hidden';
}
alert(fun.toString());//code hidden
遅いバインディングのサポート
技術的には、極めて遅いバインディングは存在しない.しかし、javaScriptは対象を実用化してからその方法を定義することができます.たとえば:
var o = new Object();
Object.prototype.sayHi = function(){
alert('hi');
}
o.sayHi();//hi