基本的に、「。」を介してオブジェクトのプロパティにアクセスすることに違いはありません。構文またはキーを介して。
var obj = new function(){this.x = "value";}
alert(obj.x === obj ['x']); //trueを出力します
「。」が使えない場合があります。、アクセスしようとしているプロパティの名前が有効な変数名ではないため(数字キーで指定したように):
var obj = new function(){this ['my-value'] = "my value";}
alert(obj ['my-value']); //「myvalue」を出力します
alert(obj.my-value); // javascriptが原因で、例外がトリガーされます
//インタプリタは「obj.my-value」を
//objのプロパティ"my"から変数"value"を引いたもの
大きな違いは、ブラウザが構文を処理する方法です。ここでわかるように、私の友人がいくつかのテストを行いました。FirefoxとSafariはキー構文に「熱心」であるのに対し、ChromeとIEはドット構文ではるかに高速に動作するようです。
結論として、「。」の場合もありますが、ほとんどの場合、どちらか一方を使用できます。少し「準備ができていない」状態になります。
プロトタイプの構文については、オブジェクトを定義すると、すべてのインスタンスにメンバーをアタッチできますが、オブジェクトのプロトタイプにメンバーをアタッチすることもできます。つまり、定義したタイプの新しいオブジェクトが作成されるたびに、自動的に継承されます。そのプロトタイプからのそのメンバー。私はそれが例でよりよく理解されると思います:
function Point(x、y){this.x = x; this.y = y;}
Point.prototype.toString = function(){
「私は「+this.x+」のx座標と「+this.y」のy座標のポイントです。
}
関数Point2(x、y){
this.x = x;
this.y = y;
this.toString = function(){
「私もポイントです。私はx: "+ this.x +"、y:"+this.yにいます。
};
}
を作成するnew Point2
と、そのtoString
メソッドはインスタンスメソッドになり、javascriptインタープリターはこのメソッドにメモリを割り当てます。
「新しいポイント」を作成すると、そのtoString
メソッドはそのプロトタイププロパティにチェーンされます。これは、そのメソッドにメモリが割り当てられていないことを意味します。
var p = []、p2 = [];
for(var i = 0; i <100000000; i ++)
{{
p.push(new Point(0,0));
p2.push(new Point2(0,0));
}
これをテストすると、両方のオブジェクトが完全に機能していることがわかりますが、Point2
オブジェクトはシステムからもう少し多くのメモリを消費します。何故ですか?'メソッド
を呼び出すと、オブジェクトは "toString"というメンバーがないことを認識し、プロトタイプチェーンの上位で検索を開始し、オブジェクトの宣言で見つかった'toString'メンバーを返します。 。
上記の例では、すべてのアイテムがプロトタイプで言及されているメソッドを指し、すべてのアイテムがメソッドの各コピーを指します。
さらに、後でメソッドを変更する場合は、すべてのインスタンスで非常に簡単に変更できます。new Point()
toString()
p
toString
p2
toString
Point
Point.prototype.toString = function(){return "I'm a smarter point";};
その後、メソッドnew Point
を呼び出すと、のすべてのインスタンスが「私は賢いポイントです」を返しますtoString
。
インスタンス用に変更しようとするとPoint2
、少し難しくなります。期待どおりに機能しないことがわかり Point2.toString = function(){return "I'm a dumber point";}
ます。インスタンスごとにメソッドを手動で変更する必要があります。
for(var i in p2)
p2 [i] .toString = function(){return "I'm a dumber point";};
どちらの方法が良いかをあなたに決めさせます:P