JavaScriptのhasOwnPropertyのプロパティとは何ですか?


97

考えてみましょう:

if (someVar.hasOwnProperty('someProperty') ) {
 // Do something();
} else {
 // Do somethingElse();
}

の正しい使用法/説明はhasOwnProperty('someProperty')何ですか?

someVar.somePropertyオブジェクトsomeVarに名前のプロパティが含まれているかどうかを単にチェックするために使用できないのはなぜsomePropertyですか?

この場合のプロパティは何ですか?

このJavaScriptはどのプロパティをチェックしますか?



この質問をしたとき、それはいくつかのhtmlをチェックする関数だと思いました。これで、javascriptオブジェクトまたはメソッドのオブジェクトまたはメソッド内の「変数」をチェックしていることがわかります。thnx!
フライ

回答:


165

hasOwnProperty呼び出し元のオブジェクトに引数の名前のプロパティがあるかどうかを示すブール値を返します。例えば:

var x = {
    y: 10
};
console.log(x.hasOwnProperty("y")); //true
console.log(x.hasOwnProperty("z")); //false

ただし、オブジェクトのプロトタイプチェーンは調べません。

for...inコンストラクトを使用してオブジェクトのプロパティを列挙するときに使用すると便利です。

詳細を確認したい場合は、いつものようにES5仕様を参照してください。


6
プロトタイプチェーンのボーナスポイント。オブジェクトに呼び出されていないときに何が呼び出されているのかを理解しようとしています...そうではありませんwindow
Kristoffer Sall-Storgaard 2012

@ KristofferSHansen-私もそう思っていましたが、質問が編集されたため、オブジェクトで呼び出されるようになりました。そうでない場合、エラーがスローされます。
James Allardice 2012

私はそれが物事を変えると思います。ただし、Chromeのコンソールから実行してもエラーは発生しません。
Kristoffer Sall-Storgaard 2012

@ KristofferSHansen-これは、コンソールがコードを実行する方法によるものだと思います(evalグローバルコードや関数コードではなく、コードとして実行されます)。空白のHTMLページで試してみたところ、「nullをオブジェクトに変換できません」というエラーが表示されました。
James Allardice 2012

@KristofferSHansenは、クラスメソッドで呼び出されたときにKunal Vashistの回答を参照します
FLY

25

短く正確な答えは次のとおりです。

JavaScriptでは、すべてのオブジェクトに、オブジェクトに関するメタ情報を持つ一連の組み込みのキーと値のペアがあります。for...inオブジェクトの構成/ループを使用してすべてのキーと値のペアをループすると、このメタ情報のキーと値のペアもループします(これは絶対に必要ありません)。

ここに画像の説明を入力してください

hasOwnPropery(property) フィルタを使用すると、メタ情報を介しこれらの不要なループが排除され、パラメータpropertyがオブジェクト内のユーザー指定のプロパティであるかどうかが直接チェックされます。フィルタアウト、私は、意味hasOwnProperty(property)、場合を見ていないpropertyメタ情報別名オブジェクトのプロトタイプチェーン内に存在しています。

それにtrue/false基づいてブール値を返します。

次に例を示します。

var fruitObject = {"name": "Apple", "shape": "round", "taste": "sweet"};
console.log(fruitObject.hasOwnProperty("name"));  //true
console.log(Object.prototype.hasOwnProperty("toString");) //true because in above snapshot you can see, that there is a function toString in meta-information

はっきりしているといいのですが!


あなたの例の最後の行であなたは書くconsole.log(Object.prototype....; どういう意味console.log(fruitObject.ですか?FruitObjectまたはObject?
HamidAraghi19年

>「このメタ情報のキーと値のペアもループしています」しかし、for (var key in fruitObject) { ... }jsを実行すると、とにかくプロトタイプ以外のキーを循環するだけで、何かが足りないのでしょうか、それともJSランタイムがキーインオブジェクトの処理方法を変更したのでしょうか。ループ?
鶏の足

13

それはチェックします:

オブジェクトに指定された名前のプロパティがあるかどうかを示すブール値を返します

hasOwnPropertyをするメソッドが返す真そうでない場合は、オブジェクトは、指定された名前、虚偽の性質を持っている場合。このメソッドは、プロパティがオブジェクトのプロトタイプチェーンに存在するかどうかをチェックしません。プロパティは、オブジェクト自体のメンバーである必要があります。

例:

var s = new String("Sample");
document.write(s.hasOwnProperty("split"));                        //false
document.write(String.prototype.hasOwnProperty("split"));         //true

2
最初の答えが短くて完全に一貫性のない文であったため、-1を付けました。その後、少し長く、少し一貫性がありますが、完全に不正確な文に更新されました。

@ amnotiam-しかし、今はかなりはっきりしていると思います...インターネットの問題でこれ以上投稿できないためです..........
Pranay Rana 2012

12

概要:

hasOwnProperty()任意のオブジェクトで呼び出すことができ、入力として文字列を受け取る関数です。trueプロパティがオブジェクトにある場合はブール値を返し、そうでない場合はfalseを返します。hasOwnProperty()に配置されObject.prototypeているため、どのオブジェクトでも使用できます。

例:

function Person(name) {
  this.name = name;
}

Person.prototype.age = 25;

const willem = new Person('willem');

console.log(willem.name); // Property found on object
console.log(willem.age); // Property found on prototype

console.log(willem.hasOwnProperty('name')); // 'name' is on the object itself
console.log(willem.hasOwnProperty('age')); // 'age' is not on the object itself

この例では、新しいPersonオブジェクトが作成されます。各Personには、コンストラクターで初期化される独自の名前があります。ただし、年齢はオブジェクトではなく、オブジェクトのプロトタイプにあります。したがって、名前と年齢のためにhasOwnProperty()戻ります。truefalse

実用的なアプリケーション:

hasOwnProperty()ループを使用してオブジェクトをループするときに非常に便利ですfor in。プロパティがプロトタイプではなくオブジェクト自体からのものであるかどうかを確認できます。例えば:

function Person(name, city) {
  this.name = name;
  this.city = city;
}

Person.prototype.age = 25;

const willem = new Person('Willem', 'Groningen');

for (let trait in willem) {
  console.log(trait, willem[trait]); // This loops through all properties, including the prototype
}

console.log('\n');

for (let trait in willem) {
  if (willem.hasOwnProperty(trait)) { // This loops only through 'own' properties of the object
    console.log(trait, willem[trait]);
  }
}


3

あなたはobject.hasOwnProperty(使用のpをオブジェクトが持っているかどうかを判断するために)列挙可能なプロパティPを-

オブジェクトは独自のプロトタイプを持つことができ、「デフォルト」のメソッドと属性がオブジェクトのすべてのインスタンスに割り当てられます。hasOwnPropertyは、コンストラクターで具体的に設定されたプロパティ、または後でインスタンスに追加されたプロパティに対してのみtrueを返します。

pがオブジェクトに対してまったく、どこでも定義されているかどうかを判断するには、if(p instanceof object)を使用します。ここで、pはプロパティ名の文字列に評価されます。

たとえば、デフォルトではすべてのオブジェクトに 'toString'メソッドがありますが、hasOwnPropertyには表示されません。


2

hasOwnPropertyは、文字列引数を取る通常のJavaScript関数です。

あなたの場合somevar.hasOwnProperty('someProperty')、、それはsomevar関数が持っているsomeproperyかどうかをチェックします-それはtrueとfalseを返します。

いう

function somevar() {
    this.someProperty = "Generic";
}

function welcomeMessage()
{
    var somevar1 = new somevar();
    if(somevar1.hasOwnProperty("name"))
    {
        alert(somevar1.hasOwnProperty("name")); // It will return true
    }
}

2

hasOwnPropertyオブジェクトプロパティがあるかどうかを確認する適切な方法です。someVar.somePropertyこの状況の代わりに使用することはできません。次の条件は、良い違いを示します。

const someVar = { isFirst: false };


// The condition is true, because 'someVar' has property 'isFirst'
if (someVar.hasOwnProperty('isFirst')) {
  // Code runs
}


// The condition is false, because 'isFirst' is false.
if (someVar.isFirst) {
  // Code does not runs here
}

したがって、のsomeVar.isFirst代わりに使用することはできませんsomeVar.hasOwnProperty('isFirst')


-1

シーンA:

const objA = { a: 1, b: 2 }
for (const key in objA) {
  if (objA.hasOwnProperty(key)) {
    console.log(objA[key])
  }
}

    Output

    1
    2

シーンB:

const objB = {
  a: 1,
  b: 2,
  hasOwnProperty() {
    return false
  }
}

for (const key in objB) {
  if (objB.hasOwnProperty(key)) {
    console.log(objB[key])
  }
}

    Outputs nothing

JavaScriptはhasOwnPropertyのプロパティを保護しないためです。 したがって、次のように使用できます。

for (const key in objB) {
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
    console.log(objB[key])
  }
}

-2

これは、オブジェクトのプロパティを持っているかどうかをチェックしますif(obj.prop)私の知る限り、それはと同じように機能します。


7
obj.propプロトタイプチェーンに従いますが、hasOwnPropertyそうではありません
Kristoffer Sall-Storgaard 2012

12
問題は、propが偽の値である場合です。if(obj.hasOwnProperty('prop'))なりtrueながらif(obj.prop)になりますfalse
ロドリゴサリング2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.