function A(b) { this.b = b || "bbb";}然后你就可以通过new ,来构建一个 A 的实例:
var a = new A("B")但是,一个首要的坑是,构造函数与一个普通函数并无不同,如果你故意不使用new,或忘记用new,都会得到奇怪的错误:
var aa = A("adadada");这样调用,并不会显式地报错,但实际上隐患深埋:
function A(b) { this.b = b || "bbb"; return {b: "0000"};}这个时候,无论是否使用new来调用A,得到的结果都会相同,即得到一个普通对象
:{b:"0000′}
var a = function (){this.b = "b"; return undefined};new a(); // {b:"b"}显式返回一个 undefined ,并不能阻止构造函数式调用的默认行为。
简单的总结:
显式的返回以下值:undefined, null, boolean, number等基础类型,并不会代替 new 式调用的默认行为。
但显式返回以下值:{},[],RegExp, Date, Function,均会代替 new 调用的默认返回值 this.
大家都看到了,后者,全都是 对象,是复杂类型。
随手一记
前面说过,本该进行 new 式调用的构造函数,被当作普通函数调用,那么,如果函数体中,有 this.x = xxx
这样的赋值语句,则会被赋值给全局对象(即 windows),从而变成一个全局变量。
原因相信大家都知道,而本书中也专门讲过:函数调用时,默认的this就是绑定至全局对象。
而本书还提到:如果函数体是严格模式,则不会绑定 this 至全局对象,如:
var a = function (){"use strict";this.b = "b"; return /111/g};a(); // 直接报错因为严格模式下,默认的 this 指向 undefined