myObject.double = function () { var that = this;//让内部函数可以通过这个变量访问到 this (myObject) var helper = function () { that.value = add(that.value, that.value); }; helper();//以函数形式调用 helper }; myObject.double();//以方法形式调用 helper console.log(myObject.value);//6
3.3 构造器调用模式
JavaScript 是基于原型继承的语言,所以对象可以从其他对象继承它们的属性。
如果在函数之前加上 new ,那么 JavaScript 就会创建一个连接到该函数的 prototype 属性的新对象,而 this 会绑定到这个新对象。
/** * 构造器调用模式(不推荐) */ var Quo = function (string) {//定义构造器函数;按照约定,变量名首字母必须大写 this.status = string;//属性 }; /** * 为 Quo 的所有实例提供一个名为 get_status 的公共方法 * @returns {*} */ Quo.prototype.get_status = function () { return this.status; }; var myQuo = new Quo("confused");//定义一个 Quo 实例 console.log(myQuo.get_status());//"confused"
按照约定,构造器函数被保存在以大写字母命名的变量中。因为如果调用构造器函数时没有加上 new,问题很大,所以才以大写字母的命名方式让大家记住调用时要加上 new。
3.4 Apply 调用模式
因为 JavaScript 是函数式的面向对象语言,所以函数可以拥有方法。
apply 方法可以构建一个参数数组,然后再传递给被调用的函数。这个方法接收两个参数:要绑定给 this 的值以及参数数组。
//相加 var array = [3, 4]; var sum = add.apply(null, array);//7 console.log(sum); //调用 Quo 的 get_status 方法,给 this 绑定 statusObject 上下文 var statusObject = { status: 'A-OK' }; var status = Quo.prototype.get_status.apply(statusObject); console.log(status);//'A-OK'
4 参数
当函数被调用时,会有一个 arguments 数组。它是函数被调用时,传递给这个函数的参数列表,包含那些传入的、多出来的参数。可以利用这一点,编写一个无须指定参数个数的函数:
//构造一个能够接收大量参数,并相加的函数 var sum = function () { var i, sum = 0; for (i = 0; i < arguments.length; i += 1) { sum += arguments[i]; } return sum; }; console.log(sum(4, 5, 6, 7, 8, 9));//39
arguments 不是一个真正的数组,它只是一个类数组的对象,它拥有 length 属性,但没有数组的相关方法。
5 返回
return 语句可以让函数提前返回。return 被执行时,函数会立即返回。
一个函数总会返回一个值,如果没有指定这个值,它就会返回 undefined。