2

プロパティ(キー)には、ドット表記と角かっこを使用してアクセスおよび設定できます。ドットプロトタイプ構文を使用する場合のアドバイス

var myObj = {};   
myObj.myProp1 = 'value1'; //works, an expando property   
myObj[myProp2] = 'value2'; // FAILS, myProp2 is undefined
myObj["myProp2"] = 'value2'; // works, an expando property
myObj[2010]= 'value'; //note the key is number, still works, an expando property??   
myObj.2010 = 'value'; // FAILS. to use dot notation, key must be a string

myObj.prototype.myProp3 = 'value3' // whats the advantage?
4

6 に答える 6

4

ドット構文を使用する場合、プロパティ名は識別子です。

var myObj = {};
myObj.myProp1 = "value1";
myObj.myProp2 = "value2";

プロパティ名は識別子の命名規則に従う必要があるため、たとえば数字で始めることはできません。

ブラケット構文を使用する場合、プロパティ名は文字列です。

var myObj = {};
myObj["myProp1"] = "value1";
myObj["myProp2"] = "value2";

角かっこで使用されるのは、変数、または文字列になる任意の種類の式です。

var myObj = {};
var prop1 = "myProp1";
myObj[prop1] = "value1";
myObj["myProp" + 2] = "value2";

プロパティ名として数値を使用すると、自動的に文字列に変換されるため、結果は同じになります。

myObj[2010] = "value";
myObj["2010"] = "value";

オブジェクトリテラルを使用して値を設定することもできます。

var myObj = { myProp1: "value1", myProp2: "value2" };

(これ{}もオブジェクトリテラルであり、プロパティがないことに注意してください。)

オブジェクトのプロトタイプを使用することは、オブジェクトタイプに名前を付けた場合(またはオブジェクトにプロトタイプを割り当てた場合)にのみ役立ちます。オブジェクトリテラルを使用してオブジェクトを作成する場合、各オブジェクトには独自のプロトタイプがあるため、プロトタイプに何かを入れると、オブジェクトに入れるのと同じ効果があります。

于 2011-01-19T12:26:37.730 に答える
1

プロパティの追加は、またはのいずれmyObj.myPropかである必要がありますmyObj["myProp"]。これは理想的なシナリオであり、JavaScriptで使用する場合の良い習慣です。

于 2011-01-19T12:08:26.050 に答える
1
var myObj = function () {

};
myObj.prototype.myProp3 = 'value3' // whats the advantage?

これは、myObjを複数のオブジェクトを作成するための構成として使用する場合に使用する必要があります。すなわち。

var obj1 = new myObj();

次に、obj1はmyProp3プロパティも取得します

編集:上記の例を編集しました。myObjをコンストラクターとして使用するには、関数として宣言する必要があります

于 2011-01-19T12:11:46.707 に答える
1

あなたの場合、オブジェクトリテラルにはプロトタイプがないため、は使用しないmyObj.prototype.myProp3 = 'value3'でください。確かにそうですが、プロパティがありません(未定義であることがわかります)。prototypemyObj.prototype

プロトタイプは関数で使用されnewキーワードを使用してその関数から構築されたすべてのオブジェクトのデフォルトのプロパティを設定します。個々のオブジェクトにプロパティを割り当てるために使用することを意図したものではありません。

于 2011-01-19T12:15:52.317 に答える
1

私にとって、それは私がオブジェクトをどのように使用するかに依存します。

連想配列やハッシュマップのように使用する場合、またはドット構文が不可能な場合は、とを使用[]ます。

ただし、それらをオブジェクトのように扱う場合は、.構文を使用します。

于 2011-01-19T13:03:07.400 に答える
1

基本的に、「。」を介してオブジェクトのプロパティにアクセスすることに違いはありません。構文またはキーを介して。

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()
ptoStringp2
toStringPoint
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

于 2011-01-19T13:24:42.467 に答える