【发布时间】:2009-09-28 10:12:19
【问题描述】:
如何检查我的 javascript 对象是否属于某种类型。
var SomeObject = function() { }
var s1 = new SomeObject();
在上述情况下typeof s1 将返回“对象”。这不是很有帮助。有什么方法可以检查 s1 是否属于 SomeObject 类型?
【问题讨论】:
标签: javascript
如何检查我的 javascript 对象是否属于某种类型。
var SomeObject = function() { }
var s1 = new SomeObject();
在上述情况下typeof s1 将返回“对象”。这不是很有帮助。有什么方法可以检查 s1 是否属于 SomeObject 类型?
【问题讨论】:
标签: javascript
无论你做什么,都要避免使用 obj.constructor.name 或任何字符串版本的构造函数。在你丑化/缩小你的代码之前,这很好用,然后一切都会中断,因为构造函数被重命名为一些模糊的东西(例如:'n'),你的代码仍然会这样做并且永远不会匹配:
// Note: when uglified, the constructor may be renamed to 'n' (or whatever),
// which breaks this code since the strings are left alone.
if (obj.constructor.name === 'SomeObject') {}
注意:
// Even if uglified/minified, this will work since SomeObject will
// universally be changed to something like 'n'.
if (obj instanceof SomeObject) {}
(顺便说一句,我需要更高的声誉才能在这里评论其他有价值的答案)
【讨论】:
从http://phpjs.org/functions/get_class/ 窃取的想法,由 SeanJA 发布。只使用对象而不需要正则表达式:
function GetInstanceType(obj)
{
var str = obj.constructor.toString();
return str.substring(9, str.indexOf("("));
}
function Foo() {
this.abc = 123;
}
// will print "Foo"
GetInstanceType(new Foo());
我刚刚学会了一种从构造函数中提取函数名的更简单方法:
obj.constructor.name
【讨论】:
你也可以看看他们在 php.js 中的做法:
【讨论】:
虽然 instanceof 是一个正确的答案,但它肯定是丑陋的语法。我提议,如果您正在创建自定义对象,您可以添加自己的类型属性并像这样检查...
var Car = function(){
this.type = Object.defineProperty(this, "type", {value:"Car"});
}
这将创建一个名为 type 的不可变属性,它与对象一起存在。如果您使用的是 Class 语法,您也可以将其设为静态。
...稍后的某个地方...
function addCar(car){
if (car.type != "Car"){
throw Error("invalid type for car");
}
...
我认为这个解决方案易于实施,更直观,因此更易于其他人使用和维护。
【讨论】: