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

Gri*_*Lab 7 javascript prototype object

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

例;

var A = function() {};

var B = function() {};

B.prototype = {

};

// Pseudocode
A.hasUserPrototype(); // False
B.hasUserPrototype(); // True
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Fel*_*ing 10

假设您想要查明对象是否是自定义构造函数的实例,您可以将其原型与Object.prototype以下内容进行比较:

function hasUserPrototype(obj) {
    return Object.getPrototypeOf(obj) !== Object.prototype;
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您constructor正确维护该属性:

function hasUserPrototype(obj) {
    return obj.constructor !== Object;
}
Run Code Online (Sandbox Code Playgroud)

这也适用于不支持的浏览器Object.getPrototypeOf.

但是这两种解决方案也会返回true其他本机对象,如函数,正则表达式或日期.要获得"更好"的解决方案,您可以将原型或构造函数与所有本机原型/构造函数进行比较.


更新:

如果你想测试一个函数是否具有用户定义的prototype值,那么恐怕没有办法检测到这个.初始值只是一个带有特殊属性(constructor)的简单对象.您可以测试此属性是否存在(A.prototype.hasOwnProperty('constructor')),但如果设置原型的人做得对,他们constructor在更改原型后正确添加了属性.