【问题标题】:Javascript type of custom objectJavascript 类型的自定义对象
【发布时间】:2009-09-28 10:12:19
【问题描述】:

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

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

在上述情况下typeof s1 将返回“对象”。这不是很有帮助。有什么方法可以检查 s1 是否属于 SomeObject 类型?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    是的,使用instanceof (MDN link | spec link):

    if (s1 instanceof SomeObject) { ... }
    

    【讨论】:

    • 确实,它可以追溯到 Netscape 2.0 中最早的 JavaScript 版本。 (不链接到 ECMA-262 的另一个原因是它非常不清楚和不可读,即使按照标准文档标准也是如此!)
    • @bobince:确实需要一些时间来适应这种风格。 :-)
    • @bobince:看看 ES6 规范......好吧......让我们说我现在正积极期待 ES5 规范中清晰的辉煌岁月。 :-)
    【解决方案2】:

    无论你做什么,都要避免使用 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) {}
    

    (顺便说一句,我需要更高的声誉才能在这里评论其他有价值的答案)

    【讨论】:

    • See this link。构造函数属性是另一种有趣的方法。继续避免使用字符串方法。
    【解决方案3】:

    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
    

    【讨论】:

    • 使用 uglifiers 失败
    • @s3c 什么失败了?如果您使用 uglifiers/terser,通常失败的是硬编码的“名称比较”,因为 uglifier/terser 正在缩短所有名称并且字符串比较失败。在这种情况下,与实际班级进行比较。
    【解决方案4】:

    你也可以看看他们在 php.js 中的做法:

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

    【讨论】:

    • 虽然链接可能有用,但如果答案中包含相关信息会更好。
    【解决方案5】:

    虽然 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");
        }
    

    ...

    我认为这个解决方案易于实施,更直观,因此更易于其他人使用和维护。

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 2023-03-24
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多