javascript语言是一门面向对象的语言,但是javascript中并没有类的概念的。于是javascript采用构造函数的方式来模拟类的效果,即我们通过函数来创建对象。这也证明了函数在javascript中具有非常重要的地位。举个例子:
var book = function(name, price) {
this.name = name;
this.price = price;
}
var java = new book('master java', 82);
当使用new关键字来调用构造函数时,执行上下文从全局变量对象(window)变成一个空的上下文,这个上下文代表了新生成的实例。因此,this关键字指向当前创建的实例
默认情况下,如果你的构造函数中没有返回任何内容,就会返回this----当前的上下文,也就是你当前创建的对象。要不然就返回任意非原始类型的值。而普通的函数如果没有明显的返回值将返回undefined。
模拟构造函数创建对象
其实使用new创建一个对象的过程并不神秘,我们可以使用代码来模拟如何创建一个对象:
var book = function(name) {
this.name = name;
};
//正常用法
var java = new book(‘master java’);
//使用代码模拟,在非ie浏览器中测试,ie浏览器不支持
var python = {};
python.__proto__ = book;
book.call(python, 'master python');
将构造函数作为普通函数调用
实际上构造函数就是个普通的函数,可以当作普通函数调用的,例如var result = book();,当然结果是undefined。区别在于函数中this的指向。我们重新修改一下上面的构造函数,
var book = function(name, price) {
this.name = name;
this.price = price;
if (this == window) {
return 'name = ' + name + , price = + price;
}
}
这样当执行var result = book(java, 100)的结果是name = java, price = 100, 而var java = new book(java, 100)的结果就是创建了一个新的对象。javascript自带的构造函数好多就是既当普通函数又当构造函数的。比如string和number,当string和number作为构造函数来使用时,
var a = new number(11);
var b = new number(11.222);
var c = new string(hello);
当string和number作为普通函数来使用时,他们可以用来作类型转换,即number函数可以将其它类型转换为number类型,string函数可以将其它类型转换为字符串,
var a = number('11'); //11
var b = number('hello'); //nan
var c = string(11); //'11'
var d = string(null); //'null'
总结
当一个函数要作为构造函数使用时通常将函数名首字母大写表示这是个构造函数,同时,一定要用new去调用构造函数。另外尽量不要把构造函数做普通函数使用,因为容易产生全局变量,同时如果处理不好返回值容易对构造函数自身的功能产生影响。
