大家都知道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是自己实例化的,肯定是随机的,这时,只能通过一个中间媒介来存储,并实现转化。
时间: 2024-10-03 14:55:53