javascript获取类型/实例名称

时间:2011-08-07 15:57:40

标签: javascript

是否有可靠的方法来获取JavaScript对象的实例?

例如,依赖虚假的“obj.getInstance()”函数。

var T = {
    Q: {
        W: {
           C: function() {}
        }
    } 
};

var x = new T.Q.W.C();
console.log( x.getInstance() === T.Q.W.C); // should output true

如果这不是ECMA规范的一部分,请在答案中包含browser / node.js支持和兼容性。

6 个答案:

答案 0 :(得分:27)

仅在Chrome上测试过:

function FooBar() {

}

var foobar = new FooBar();

console.log(foobar.constructor.name);  // Prints 'FooBar'

答案 1 :(得分:24)

要获取指向实例化函数的指针(不是“类”,而是类型),请使用obj.constructor obj对象


在JavaScript中没有类。因此,JavaScript中没有类实例。只有对象。对象继承自其他对象(它们所谓的原型)。你在代码中所做的是字面上定义一个对象T,其属性Q是另一个对象,其属性W是另一个对象,其属性C是一个函数。

当您“创建T.Q.W.C的新实例”时,实际上只是将函数T.Q.W.C作为构造函数调用。称为构造函数的函数将返回一个新对象,在该对象上调用构造函数(即this使用新对象,如constructorFunction.apply(newObject, arguments);)。返回的对象将具有隐藏属性constructor,该属性将指向作为构造函数调用的函数来创建对象。此外,还有一个语言功能,允许您使用instanceof运算符测试给定函数是否用作对象的构造函数。

所以你可以做到以下几点:

console.log(x instanceof T.Q.W.C);

OR

console.log(x.constructor === T.Q.W.C);

答案 2 :(得分:6)

如果有人在2017年仍在阅读此内容:

使用obj.constructor时要小心,因为它不是不可变属性。

instanceof运算符通常更可靠。您也可以使用Object.getPrototypeOf(obj)

var arr = [];
arr instanceof Array; // true
Object.getPrototypeOf(arr); // Array [  ]
Object.getPrototypeOf(arr) === Array.prototype; // true

请参阅有关该主题的有用文档:

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch5.md

答案 3 :(得分:4)

我遇到了一些麻烦,解决方案是:

String(x.constructor) === String(T.Q.W.C)

答案 4 :(得分:0)

你可以这样做:

    get(){ // Method
        for ( var nameOfVariable in window ) 
            if (eval(nameOfVariable +"=== this")) return nameOfVariable;// true if variable name is instace of this
        return "";            
    }

答案 5 :(得分:0)

请注意,contructor.name 不能与 minifying 一起使用(它将是一个空字符串)——这里只能使用 instanceof。