是否有可靠的方法来获取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支持和兼容性。
答案 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。