大家都知道JavaScript是一種面向對象的語言,對象可以通過new關鍵字,實例化出來,但是,如果我想獲取實例化對象的名字,怎么破?比如:
1 function Dog() { 2 this.myName = function() { 3 } 4 }; 5 6 var dog = new Dog();
如何獲取這個dog的名字"dog"呢?大家想過沒,可以先想想!
其實大家想過沒有,定義的全局變量為什么能夠直接訪問使用呢?實際上全局變量是綁定在window對象上的,都是window對象的屬性,如下:
1 var age = 20; 2 console.log(window.age); // 輸出 20
好了,我們返回上面的例子,那么dog其實也是綁定在window對象上的,如下:
1 function Dog() { 2 this.myName = function() { 3 } 4 }; 5 var dog = new Dog() 6 console.log(window.dog); // 輸出 Dog {}
那么接下來,就可以利用這個特點,來搞點什么,如下:
1 function Dog() { 2 this.myName = function() { 3 4 // 這里循環查找window對象中的dog屬性 5 for (var name in this.global) { 6 7 // 判斷是否為Dog類 8 if (this.global[name] === this) { 9 return name; 10 } 11 } 12 } 13 } 14 15 // 這里,將window對象的引用,存到Dog原型的global中 16 Dog.prototype.global = this; 17 18 var dog = new Dog(); 19 20 console.log(dog.myName()); // 輸出"dog"
就這樣,就獲取了實例化對象的名字了,nice!
總結:
- 該方法的主要原理是通過全局變量的存儲機制,是綁定在window對象上的;
- 什么時候需要去獲取實例化對象的名字呢?一般的場景都不需要吧,這個主要是dog是個對象,但是我時候要把它當做字符串來用,比如打印日志,構造了"dog"對象,這個時候,其實就派上用場了。
- dog是自己實例化的,肯定是隨機的,這時,只能通過一個中間媒介來存儲,並實現轉化。