检查对象是否具有用户定义的原型?

时间:2013-05-16 20:47:05

标签: javascript object prototype

简单地说,我可以检查一个对象是否有用户定义的原型吗?

实施例

var A = function() {};

var B = function() {};

B.prototype = {

};

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

这可能吗?

3 个答案:

答案 0 :(得分:9)

假设您想知道对象是否是自定义构造函数的实例,您可以将其原型与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属性。 / p>

答案 1 :(得分: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');

答案 2 :(得分:0)

对于对象原型将是未定义的:

typeof A.prototype == "undefined" // true
typeof B.prototype == "undefined" // false