【问题标题】:Check if an object has a user defined prototype?检查对象是否具有用户定义的原型?
【发布时间】:2013-05-11 22:06:15
【问题描述】:

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

示例;

var A = function() {};

var B = function() {};

B.prototype = {

};

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

这可能吗?

【问题讨论】:

  • 什么叫用户定义?不是您创建的原型?
  • 您只是将原型设置为这些对象的属性,您提供的示例不会发生原型继承。
  • @zzzzBov 我知道这一点。但是在我的示例中,我仍然通过为其分配一个空对象来修改原型,有没有办法检查这个?
  • @GriffLab,您没有修改“原型”,您只是修改了对象上恰好被称为“原型”的属性。
  • @GriffLab:“原型”在 JavaScript 中是一个非常具体的术语。在您的示例中,您没有更改对象的原型,您只是创建了一个名称为prototype 的完全任意属性。只有 functionsprototype 属性以特殊方式处理。如果你只是想测试一个属性是否存在,你应该用不同的方式来表达这个问题(我确定它是重复的)。

标签: javascript object prototype


【解决方案1】:

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

【讨论】:

  • @dandavis:因为"fred" 是原始值,而不是对象。
【解决方案2】:

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');

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我怕undefined被定义。
    • @Riateche 我同意你的观点。
    • 真的吗?我完全支持防御性编码,但我从未见过有人将 undefined 重新定义为其他东西......
    • A.prototype = undefined 将在对象上设置一个名为 prototype 的属性,并使用此代码返回不正确的值。
    • @dandavis:不一定是这样。我最近做了一些测试,结果证明这两种方式都同样快,至少在 Chrome 中是这样。 typeof 不是函数,而是运算符,因此可能相当快。
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 2020-01-02
    • 2017-06-23
    • 2011-08-15
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2020-05-12
    相关资源
    最近更新 更多