匿名オブジェクトにメソッドがあるかどうかを確認するにはどうすればよいですか?


145

そのように作成された匿名オブジェクトかどうかを確認するにはどうすればよいですか?

var myObj = { 
    prop1: 'no',
    prop2: function () { return false; }
}

実際にprop2が定義されていますか?

prop2 常に関数として定義されますが、一部のオブジェクトでは必須ではなく、定義されません。

ここで提案されたものを試しました:ネイティブJavaScriptオブジェクトにプロパティ/メソッドがあるかどうかを確認する方法は?しかし、私はそれが匿名オブジェクトに対しては機能しないと思います。


6
JavaScriptでは、匿名オブジェクトと非匿名オブジェクトの間に大きな違いはありません。カバーの下でも同じです。
10

回答:


278

typeof myObj.prop2 === 'function'; 関数が定義されているかどうかを通知します。

if(typeof myObj.prop2 === 'function') {
    alert("It's a function");
} else if (typeof myObj.prop2 === 'undefined') {
    alert("It's undefined");
} else {
    alert("It's neither undefined nor a function. It's a " + typeof myObj.prop2);
}

1
動的変数で確認したい場合は、これを試してくださいif(typeof myObj[propoeryStr] === 'function') { ... }
Vivek

42

あなたが欲しいhasOwnProperty()

var myObj1 = { 
	prop1: 'no',
	prop2: function () { return false; }
}
var myObj2 = { 
	prop1: 'no'
}

console.log(myObj1.hasOwnProperty('prop2')); // returns true
console.log(myObj2.hasOwnProperty('prop2')); // returns false
	

参考文献:Mozillaのマイクロソフトphrogz.net


4
自作オブジェクト内にdomノードを配置した場合、たとえばfalseの場合var my_obj = {'node1': document.createElement('div')};、これは機能しませんmy_obj.node1.hasOwnProperty('cloneNode')。しかし、ショーンのソリューションは正常にtrueを返します:typeof my_obj.node1.cloneNode === 'function'
mulllhausen

6
プロトタイプで定義されたメソッドを探している場合は機能しません。
Wilt

2
@Wiltの質問で匿名オブジェクトリテラルが指定されました。
artlung 2016年

4
@artlungはい、あなたの答えは質問に適しています。他のケースで機能する同様のソリューションを探している可能性のある他の人(私のような)にコメントを残したいだけです...あなたの答えを失格にするつもりはありませんでした。
Wilt

2
プロパティが定義されている場合は処理しませんが、関数ではありません。
matt2000

15

3つのオプション

  1. typeof myObj.prop2 === 'function' プロパティ名が動的/生成されていない場合
  2. myObj.hasOwnProperty('prop2') プロパティ名が動的であり、それが直接のプロパティであるかどうかのみをチェックします(プロトタイプチェーンの下ではない)。
  3. 'prop2' in myObj プロパティ名が動的で、プロトタイプチェーンをチェックダウンする場合

8

「匿名オブジェクト」とはどういう意味ですか?myObj変数にオブジェクトリテラルを割り当てているため、匿名ではありません。あなたはこれをテストすることができます:

if (typeof myObj.prop2 === 'function')
{
    // do whatever
}


0

私はこれが古い質問であることを知っていますが、OPが存在を確認するだけの場合、すべての回答がメソッドの存在関数であることを確認して驚いています。(多くの人が述べたように)それが関数であることを知るには、以下を使用できます。

typeof myObj.prop2 === 'function'

ただし、条件として使用することもできます。

typeof myObj.prop2

あるいは:

myObj.prop2

これは、関数がに評価されtrue、にundefined評価されるためfalseです。したがって、メンバーが存在する場合、それが関数である可能性があることがわかっている場合は、以下を使用できます。

if(myObj.prop2) {
  <we have prop2>
}

または式で:

myObj.prop2 ? <exists computation> : <no prop2 computation>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.