本节书摘来自异步社区《JavaScript启示录》一书中的第1章,第1.2节,作者:【美】Cody Lindley著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.2 JavaScript构造函数构建并返回对象实例
构造函数的作用是创建多个共享特定特性和行为的对象。构造函数主要是一种用于生成对象的饼干模具,这些对象具有默认属性和属性方法。
如果说“构造函数只是一个函数”,那么我会说“你是对的,除非使用new关键字来调用该函数。”(如new String('foo'))。如果使用new调用某函数,该函数则担任一个特殊的角色,JavaScript给予该函数特殊待遇,将该函数的this值设置为正在构建的新对象。除了这个特殊行为,该函数还默认返回新创建的对象(即this),而不是虚假值。该函数返回的新对象则被认为是构建该对象的构造函数的实例。
再次思考Person()构造函数,但这一次要仔细阅读下面代码中的注释,因为其内容强调了new关键字的作用。
<!DOCTYPE html><html lang="en"><body><script>
// Person是一个构造函数,可以使用new关键字进行实例化
var Person = function Person(living, age, gender) {
// 下面的this表示即将创建的新对象(即,this = new Object();)
this.living = living;
this.age = age;
this.gender = gender;
this.getGender = function () { return this.gender; };
// 一旦该Person函数使用new关键字调用,就返回this,而不是undefined
};
// 实例化Person对象,命名为cody
var cody = new Person(true, 33, 'male');
// cody是一个对象,并且是Person()的一个实例
console.log(typeof cody); // 输出object
console.log(cody); // 输出cody内部的属性和值
console.log(cody.constructor); // 输出Person() 函数
</script></body></html>
上述代码利用了自定义构造函数(即Person())来创建cody对象。这与Array()构造函数创建Array()对象(如new Array())没有什么不同:
<!DOCTYPE html><html lang="en"><body><script>
// 实例化Array对象,命名为myArray
var myArray = new Array(); // myArray是Array的一个实例
// myArray是一个对象,并且是Array()构造函数的一个实例
console.log(typeof myArray); // 输出object! 什么? 是的,数组是object类型
console.log(myArray); // 输出[ ]
console.log(myArray.constructor); // 输出Array()
</script></body></html>
在JavaScript中,大多数值(不包括原始值)都涉及正在被创建的对象,或者是从构造函数实例化的对象。构造函数返回的对象被称为实例。读者要熟悉这些语义,同样要熟悉利用构造函数来构建对象的模式。