简单地说,我可以检查一个对象是否有用户定义的原型吗?
例子;
var A = function() {};
var B = function() {};
B.prototype = {
};
// Pseudocode
A.hasUserPrototype(); // False
B.hasUserPrototype(); // True
这可能吗?
简单地说,我可以检查一个对象是否有用户定义的原型吗?
例子;
var A = function() {};
var B = function() {};
B.prototype = {
};
// Pseudocode
A.hasUserPrototype(); // False
B.hasUserPrototype(); // True
这可能吗?
假设您想确定一个对象是否是自定义构造函数的实例,您可以将其原型与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
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');
对于 A 对象原型将是未定义的:
typeof A.prototype == "undefined" // true
typeof B.prototype == "undefined" // false