Javascript类型的自定义对象

时间:2009-09-28 10:12:19

标签: javascript

如何检查我的javascript对象是否属于某种类型。

var SomeObject = function() { }
var s1 = new SomeObject();

在上述情况下typeof s1将返回“对象”。这不是很有帮助。有没有办法检查s1是否为SomeObject类型?

5 个答案:

答案 0 :(得分:71)

是的,使用instanceofMDN link | spec link):

if (s1 instanceof SomeObject) { ... }

答案 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中的表现方式:

http://phpjs.org/functions/get_class:409

答案 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");
    }

...

我认为此解决方案易于实现,更直观,因此对于其他人来说更易于使用和维护。