logo

JavaScript には OwnProperty があります

このチュートリアルでは、に関連する制限と機能の側面を見ていきます。 hasOwnProperty() JavaScriptのメソッド。このセクションでは、その実装と使用法についても学習します。

導入

JavaScript 、 hasOwnProperty() メソッドは、オブジェクトが言及されたプロジェクトに属しているかどうかを確認するプロパティとして定義されています。プロパティが認識されたオブジェクトに属していることが判明した場合は、ブール ステートメント ベースの出力、つまり true または false を返します。

構文

 object.hasOwnProperty(propname) 

口論

録音:

ここでは、シンボルまたは文字列名を渡す必要があります。これは、シンボルまたは文字列がオブジェクトに属しているかどうかがチェックされる prop の場所であるためです。これは、以下に示す方法を使用して行われます。

バブルソートJava
 var movie = { name: 'iron man', genre: 'super hit', } var song = { name: 'cardigan', } movie.hasOwnProperty('name'); // returns true movie.hasOwnProperty('type'); // returns false song.hasOwnProperty('name'); // returns true song.hasOwnProperty('status'); // returns false 

ここで注意すべき重要な点の 1 つは、メソッド hasOwnProperty() は通常、継承されたプロパティを無視することです。これは、オブジェクトに非継承プロパティがあることが判明し、名前が propname で指定されている場合、メソッドは true を返すことを意味します。 false を返す場合は、オブジェクトに指定された名前のプロパティがないか、proptype のオブジェクトからプロパティを継承していることを意味します。

 // Create an object var o = new Object(); // Define a noninherited local property o.x = 3.14; o.hasOwnProperty('x'); // Returns true: x is a local property of o o.hasOwnProperty('y'); // Returns false: o doesn't have a property y o.hasOwnProperty('toString'); // Returns false: toString property is inherited hasOwnProperty() will return true even if you define the undefined or null value. let a = new Object(); a.propertyOne = null; a.hasOwnProperty('propertyOne') // output: true a.propertyTwo = undefined; a.hasOwnProperty('propertyTwo') //Output: true 

hasOwnProperty() メソッドを使用するもう 1 つの利点は、文字列をデフォルトの引数として渡すという概念に従ってオブジェクトを初期化できることです。値がオブジェクトで利用可能であることが判明した場合、すぐに true で応答します。それ以外の場合、見つからない場合は false を返します。これは、以下に示すコード スニペットを使用して実証できます。

 function Car(name) { this.name = name; } Car.prototype.color = 'red'; const bmw = new Car('x1'); console.log(bmw.name); // property found on object console.log(bmw.color); // color property found on prototype console.log(bmw.hasOwnProperty('name')); // name is found on the object itself console.log(bmw.hasOwnProperty('color')); // color property is not found on the object itself 

上記のコード スニペットでは、変数によって新しいオブジェクトが作成されます。 。これで、Car はコンストラクターの下で定義されたプロパティと名前を使用して開始されたと言えます。開始時にオブジェクト内で色が指定されない場合がありますが、プロトタイプでは常に使用可能です。 階層 。したがって、 hasOwnProperty() は名前については常に true を返しますが、色の場合は false を返します。

パフォーマンスに関して言えば、hasOwnProperty() はループでオブジェクトを通過しながらスムーズに動作します。ここまでで、プロパティがオブジェクトに具体的に属していると言えます。プロトタイプとは何の相関性もありません。これのデモンストレーションは、以下に示すコード スニペットを使用して示すことができます。

Javaはintを文字列に変換します
 // declaring a Car function function Car(name) { this.name = name; } // setting up new prop with prototype Car.prototype.color = 'red'; // creating a new Car object const BMW = new Car('x1'); // looping through every car prop including prototype as well for (let car in BMW) { car + ':', BMW[car]; } /* output: name: x1 output: color: red */ /**************************************/ /*will loop through only self properties of the object, excludes property generated through prototype method */ for (let car in BMW) { if (BMW.hasOwnProperty(car)) { console.log(car + ':', BMW[car]); } } // output: name: 

hasOwnProperty() メソッドを使用すると、hasOwnProperty という名前のプロパティを定義するときにオブジェクトのレンダリングが行われるため、このメソッドが役に立たなくなる可能性があります。これを裏付けるために、以下に示すコード スニペットを理解してください。

 var harrypotter = { hasOwnProperty: function() { return true; } }; // Outputs: true console.log(harrypotter.hasOwnProperty('ridikulus')); 

上記のコード スニペットでは、harrypotter がすでに hasOwnProperty を持っていることがわかります。したがって、object.prototype.hasOwnProperty への呼び出しは行われません。これにより、通話は可能になるものの、最終的には失敗する可能性があるというケースが想定されます。したがって、通話の可能性を常に認識しておくことをお勧めします。以下のコード スニペットは、その回避策を示しています。

 // Returns false Object.prototype.hasOwnProperty.call(harrypotter, 'ridikulus'); 

上記のコード スニペットでは、harrypotter が独自の定義を行っていることは明らかです。 所有プロパティを持つ 。 Object.prototype.hasOwnProperty への呼び出しは決して行われません。値が false で、すぐに機能することが困難になる場合に false を返す可能性があるためです。このステートメントをサポートするには、以下のコード スニペットを参照してください。

 // Returns false Obje ct.prototype.hasOwnProperty.call(harrypotter, 'ridikulus'); 

hasOwnProperty と同様に、「in」メソッドと呼ばれる別のメソッドがあります。また、オブジェクトにキーが存在するかどうかを確認するためにも使用されます。ただし、hasOwnProperty と in メソッドの主な違いは、in メソッドは継承されるプロパティと、継承されたプロパティがオブジェクト用に特別に作成されるプロパティを区別する順序に従わないという事実にあることに注意することが重要です。これは、以下に示すコード スニペットを使用して示すことができます。

 var fantasyLit = { tolkien: 'The Lord of the Rings', lewis: 'The Chronicles of Narnia' }; // Outputs: true console.log('tolkien' in fantasyLit); // Outputs: false console.log('asimov' in fantasyLit); // Outputs: true console.log('constructor' in fantasyLit); 

上記のコード スニペットでは、「in」メソッドが、すべてのオブジェクトが継承される Object.prototype のコンストラクター プロパティに従っていることは明らかです。

いくつかの点を付け加えますと、どちらの方法にも欠点があります。どちらのメソッドも、すでに宣言されているプロパティに関する情報を簡単に得ることができますが、実際の値を含むプロパティについては知ることができません。

配列と配列リスト

両方のメソッドがこの回避策をどのように実行するかを示す次のコード スニペットを考えてみましょう。

 // Puts a 'declared' property on the global object // (window in browsers) var declared; // Outputs: true console.log('declared' in window); // Outputs: true console.log(window.hasOwnProperty('declared')); // Outputs: undefined console.log(declared); var obj = { myUndefined: undefined }; // Outputs: true console.log('myUndefined' in obj); // Outputs: true console.log(obj.hasOwnProperty('myUndefined')); // Outputs: undefined console.log(obj.myUndefined); 

結論

このチュートリアルでは、JavaScript の hasOwnProperty() メソッドについて説明しました。一般に、この方法は、ほとんどの開発者にとって、コンストラクターなどの特殊なキーに関連する問題を調べて回避するための優れた選択肢です。何らかのプロパティを持つオブジェクトを見つけた場合は、デフォルトで hasOwnProperty() を使用することをお勧めします。オブジェクトの toString() メソッドをチェックして呼び出しを行う関数が存在する場合は、 in を使用する必要があります。