8

簡単に言えば、オブジェクトにユーザー定義のプロトタイプがあるかどうかを確認できますか?

例;

var A = function() {};

var B = function() {};

B.prototype = {

};

// Pseudocode
A.hasUserPrototype(); // False
B.hasUserPrototype(); // True

これは可能ですか?

4

3 に答える 3

11

オブジェクトがカスタム コンストラクター関数のインスタンスであるかどうかを調べたいと仮定すると、そのプロトタイプを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プロパティが追加されます。

于 2013-05-16T20:55:53.883 に答える
1

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');
于 2013-05-16T21:08:19.820 に答える