如何检查我的javascript对象是否属于某种类型。
var SomeObject = function() { }
var s1 = new SomeObject();
在上述情况下typeof s1
将返回“对象”。这不是很有帮助。有没有办法检查s1是否为SomeObject类型?
答案 0 :(得分:71)
答案 1 :(得分:14)
无论你做什么,都要避免使用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) {}
(顺便说一句,我需要更高的声誉来评论其他有价值的答案)
答案 2 :(得分:5)
来自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
答案 3 :(得分:2)
你还可以看看他们在php.js中的表现方式:
答案 4 :(得分:0)
虽然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");
}
...
我认为此解决方案易于实现,更直观,因此对于其他人来说更易于使用和维护。