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

Javascript 检查对象是否具有用户定义的原型?,javascript,object,prototype,Javascript,Object,Prototype,简单地说,我可以检查一个对象是否有用户定义的原型吗 榜样 var A = function() {}; var B = function() {}; B.prototype = { }; // Pseudocode A.hasUserPrototype(); // False B.hasUserPrototype(); // True 这可能吗?对象原型将未定义: typeof A.prototype == "undefined" // true typeof B.prototype

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

榜样

var A = function() {};

var B = function() {};

B.prototype = {

};

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

这可能吗?

对象原型将未定义:

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

假设您想确定某个对象是否是自定义构造函数的实例,您可以将其原型与
对象进行比较。原型

function hasUserPrototype(obj) {
    return Object.getPrototypeOf(obj) !== Object.prototype;
}
或者如果您正确维护了
构造函数
属性:

function hasUserPrototype(obj) {
    return obj.constructor !== Object;
}
这也适用于不支持
Object.getPrototypeOf
的浏览器

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


更新:

如果您想测试函数是否具有用户定义的
原型
值,那么恐怕无法检测到这一点。初始值只是一个具有特殊属性的简单对象(
constructor
)。您可以测试此属性是否存在(
A.prototype.hasOwnProperty('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 
};
这假设对象未被视为hashmap,其中已设置了其他属性,如
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');

什么叫用户定义?不是您创建的原型?您只是将原型设置为这些对象的属性,您提供的示例不会出现原型继承。@zzzzBov我知道这一点。但在我的示例中,我修改了原型,为其分配了一个空对象,有没有办法检查这一点?@griflab,您没有修改“原型”,您只修改了对象上一个名为“原型”的属性。@griflab:“原型”在JavaScript中是一个非常特殊的术语。在您的示例中,您没有更改对象的原型,只是创建了一个名为
prototype
的完全任意属性。只有函数的
原型
属性以特殊方式处理。如果你只是想测试一个属性是否存在,你应该用不同的措辞来回答这个问题(我确信它是重复的)。我担心
未定义的
会被定义。@riate我同意你的看法。真的吗?我完全支持防御性编码,但我从未见过有人将未定义的重新定义为其他内容…
A.prototype=undefined
将在对象上设置一个名为
prototype
的属性,并将使用此代码返回一个不正确的值。@dandavis:这不一定是真的。我最近做了一些测试,结果表明这两种方法都同样快,至少在Chrome中是如此
typeof
不是一个函数,而是一个运算符,因此速度可能相当快。@dandavis:因为
“fred”
是一个基本值,而不是一个对象。