2011-08-07 142 views
12

是否有獲取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規範的一部分,請包括瀏覽器/ node.js支持和兼容性答案。

+1

我認爲你必須改寫的問題。 'x' *是一個實例,是的,使用'new'來獲得一個實例是非常可靠的。也許你正在尋找'instancof',來獲取實例的類型? https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/instanceof –

回答

19

要獲得的指針實例化的功能(這是不是一個「類」,但是類型),使用obj.constructor其中obj是任何對象。


在JavaScript中沒有類。因此,JavaScript中沒有類實例。只有對象。對象從其他對象(他們所謂的原型)繼承。你在代碼中做的是從字面上定義一個對象T,它的屬性Q是另一個對象,它的屬性W是另一個對象,屬性C是一個函數。

當你「創建一個T.Q.W.C的新實例」時,你實際上只調用T.Q.W.C作爲構造函數。一個稱爲構造函數的函數將返回一個新的對象,在該對象上調用構造函數(即使用this作爲新對象,如constructorFunction.apply(newObject, arguments);)。返回的對象將具有一個隱藏屬性constructor,它將指向作爲constrcutor創建對象的函數。此外還有一種語言功能,它允許您使用instanceof運算符測試給定函數是否用作對象的構造函數。

所以,你可以做到以下幾點:

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

OR

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

我希望你不介意編輯。 –

+0

下一個答案回答問題。 – ekerner

4

我遇到了一些麻煩與此相關,解決辦法是:

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

只有在Chrome測試:

function FooBar() { 

} 

var foobar = new FooBar(); 

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

如果有人仍然在讀這在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