簡単に言えば、オブジェクトにユーザー定義のプロトタイプがあるかどうかを確認できますか?
例;
var A = function() {};
var B = function() {};
B.prototype = {
};
// Pseudocode
A.hasUserPrototype(); // False
B.hasUserPrototype(); // True
これは可能ですか?
簡単に言えば、オブジェクトにユーザー定義のプロトタイプがあるかどうかを確認できますか?
例;
var A = function() {};
var B = function() {};
B.prototype = {
};
// Pseudocode
A.hasUserPrototype(); // False
B.hasUserPrototype(); // True
これは可能ですか?
オブジェクトがカスタム コンストラクター関数のインスタンスであるかどうかを調べたいと仮定すると、そのプロトタイプをObject.prototype
次のように比較できます。
function hasUserPrototype(obj) {
return Object.getPrototypeOf(obj) !== Object.prototype;
}
constructor
または、プロパティを適切に維持する場合:
function hasUserPrototype(obj) {
return obj.constructor !== Object;
}
これは、サポートしていないブラウザーでも機能しますObject.getPrototypeOf
。
ただし、どちらのソリューションtrue
も、関数、正規表現、日付などの他のネイティブ オブジェクトに対しても返されます。「より良い」ソリューションを得るには、プロトタイプまたはコンストラクターをすべてのネイティブ プロトタイプ/コンストラクターと比較できます。
アップデート:
関数にユーザー定義の値があるかどうかをテストしたい場合prototype
、残念ながらこれを検出する方法はありません。初期値は、特別なプロパティ ( ) を持つ単純なオブジェクトconstructor
です。このプロパティが存在するかどうかをテストすることもできA.prototype.hasOwnProperty('constructor')
ますが ( )、プロトタイプを設定した人が正しく設定した場合、プロトタイプの変更後に適切にconstructor
プロパティが追加されます。
Felix King は継承の問題に正確に対処したので、代わりに既存のプロパティの概念に対処します。
オブジェクトで名前が付けられたプロパティの存在を単に確認しようとしている場合はprototype
、次を使用できます。
a.hasOwnProperty('prototype')
これは、次の場合に true を返します。
a = {
//the object has this property, even though
//it will return undefined as a value
prototype: undefined
};
これは、オブジェクトがハッシュマップとして扱われていないことを前提としています。他のプロパティhasOwnProperty
が設定されている場合などです。それ以外の場合、プロパティの存在を確認するより安全な方法は次のとおりです。
Object.prototype.hasOwnProperty.call(a, 'prototype')
これは、次のように汎用関数に変換できます。
has = (function (h) {
"use strict";
return function (obj, prop) {
h.call(obj, prop);
};
}(Object.prototype.hasOwnProperty));
次のように使用されます。
has(a, 'prototype');