JavaScript函数的特性与应用实践深入详解(2)

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。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/447.html