2012-04-25 11 views
12

私はここ1〜2年でおそらく過去1年間に10〜20分を費やしてきましたが、この質問に対する防御的な答えは決して見つかりませんでした。JavaScriptオブジェクトがサブクラスではなく `{}`インスタンスであるかどうかを確認するにはどうすればよいですか?

JavaScriptオブジェクトがサブクラスではなくObjectのインスタンスであるかどうかを確認するにはどうすればよいですか?

arguments[0]がネイティブObjectを拡張するが、どちらも異なる扱いをしなければならない "オプション"ハッシュ対 "モデル"(MVC)かどうかをチェックすることです。

私は、これらの試みている:いくつかのケースでは動作しません(正確に覚えていませんが、多分regex.constructor、そのようなこと)

// some helper to get constructor name 
function klassName(fn) { 
    if (fn.__name__) { 
    return fn.__name__; 
    } 
    if (fn.name) { 
    return fn.name; 
    } 
    return fn.toString().match(/\W*function\s+([\w\$]+)\(/)); 
}; 

var Model = function() {}; 

m = new Model; 
o = {}; 

Object(o) === o; // true 
Object(m) === m; // true, thought it might be false 

klassName(o.constructor); // Object 
klassName(m.constructor); // Model 

klassName(m.constructor)こと。たぶんそれは、確かに分かりません。

{}オブジェクトがあるかどうかを知るための防弾方法はありますか?

+1

を変更します。 'Bulletproof'機能そのものではありません。 :) –

+1

BTW - JavaScriptには**サブクラス**がありません。コンストラクタ関数とプロトタイプのみ。 – gnarf

答えて

11

function isObj(test) { 
    return test.constructor === Object; 
} 

のような単純なものは、あなたが探しているものかもしれませんか?

Test in jsFiddle

+0

これは機能します。私は私の答えを更新するのに似たようなものを試していました。これは動作します。それは弾丸ですか? – elclanrs

+0

@elclanrs - [browserstack](http://browserstack.com)を使用して、それぞれの対象ブラウザを確認することをお勧めします。 – gnarf

+0

@elclanrs - それがどこかでうまくいかない場合は、私も答えにそれを得ることができるかどうかがわかります。私はIE 6 - 9&Chrome、Firefox、Opera Latestでそれをテストしました。これはほとんどの場合に有効です。 – gnarf

1

これは意味ですか? http://jsfiddle.net/elclanrs/ukEEw/

var o = {}; 
var re = /\d/; 
var f = function(){}; 
var d = new Date(); 

var isObj = function(e){ 
    return e.toString() === '[object Object]'; 
}; 

console.log(isObj(o)); // True 
console.log(isObj(re)); // False 
console.log(isObj(f)); // False 
console.log(isObj(d)); // False 

+0

'obj.toString()'の代わりに 'Object.prototype.toString.call(obj)'を使うことを考えてください。 – gnarf

+0

'isObj(新しいモデル); // true' –

0

私は防弾ではJavaScript何で一つのこと

var isObj = function(e){ 
    if(!e) return false; // change this line 
    return e.toString() === '[object Object]'; 
}; 
関連する問題