本篇主要记录在学习了解Javascript的过程中,遇到的问题及释惑过程,本篇会持续更新,遇到时记录之。
问题一:经常看到有这样定义属性和方法,如下:
var EventEmitter = function() {
this.listener = {}
}
EventEmitter.prototype.on = function(type,handler,context) {
this.listener[type] = handler
}
EventEmitter.prototype.off = function(type,handler,context) {
}
复制代码
上面的属性定义在构造函数内部,而方法却定义在prototype上,不知这样做有什么好处?
答:将方法定义到构造函数的prototype对象上,使得通过该构造函数生成的实例对象拥有的方法都指向一个函数索引,可以节省内存。
这里需要搞清楚地就是prototype上的属性和方法是所有实例对象共有的一份,如同Java里的静态属性和静态方法类似。
问题二:为什么javascript在创建对象之后,还可以随时添加属性和方法?
答:网上有网友的解答是说,js的对象也是一个关联数组,所以可以使用"." 或 "[xx]"的方式进行添加属性和方法。
问题三:下面代码为什么第1种方式和第2种方式得到的结果不一样?
//第1种方式
var str1 = new String("hello");
str1.s = "world";
console.log(str1.s); // world
//第2中方式
var str2 = "hello";
str2.s = "world";
console.log(str2.s); //undefined
复制代码
答:上面2种方式得到的结果是不一样的,第1种可以添加属性,而第2中添加之后却被立即释放了,之后的取值则变成undefined了。其中str1是Object对象,而str2是string的基本数据类型。参考这篇解答里的说明js中为什么不能给基本类型的变量添加属性和方法,可知,虽然在js中一切都是对象,但对基本类型的操作上还是有所不同,上面的str2类型是string,在进行str2.s的操作时,js引擎内部会临时创建一个String对象的包装器,将对str2的操作代理到该对象上,但是操作完成之后,该临时包装类型就被释放了。
问题四:js的五种基本类型,undefined、null、Number、String、Boolean,如何理解undefined和null?
答:null可以理解为指向空对象的指针,undefined派生自null。