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

如果使用 new 前缀来调用一个函数,那么它的返回值是:创建的一个连接到该函数的 prototype 属性的新对象。

6 异常

异常是干扰程序正常流程的事故。发生事故时,我们要抛出一个异常:

var add = function (a, b) {
  if (typeof a !== 'number' || typeof b !== 'number') {
    throw{
      name: 'TypeError',
      message: 'add needs numbers'
    };
  }
  return a + b;
}

throw 语句会中断函数的执行,它要抛出一个 exception 对象,这个对象包含一个用来识别异常类型的 name 属性和一个描述性的 message 属性。也可以根据需要,扩展这个对象。

这个 exception 对象会被传递到 try 语句的 catch 从句:

var try_it = function () {
  try {
    add("seven");
  } catch (e) {
    console.log(e.name + ": " + e.message);
  }
};
try_it();

一个 try 语句只会有一个捕获所有异常的 catch 从句。所以如果处理方式取决于异常的类型,那么我们就必须检查异常对象的 name 属性,来确定异常的类型。

7 扩充类型的功能

可以给 Function.prototype 增加方法来使得这个方法对所有的函数都可用:

/**
 * 为 Function.prototype 新增 method 方法
 * @param name 方法名称
 * @param func 函数
 * @returns {Function}
 */
Function.prototype.method = function (name, func) {
  if (!this.prototype[name])//没有该方法时,才添加
    this.prototype[name] = func;
  return this;
};

通过这个方法,我们给对象新增方法时,就可以省去 prototype 字符啦O(∩_∩)O~

有时候需要提取数字中的整数部分,我们可以为 Number.prototype 新增一个 integer 方法:

Number.method('integer', function () {
  return Math[this < 0 ? 'ceil' : 'floor'](this);
});

它会根据数字的正负来决定是使用 Math.ceiling 还是 Math.floor

然后再为 String 添加一个移除字符串首尾空白的方法:

String.method('trim', function () {
  return this.replace(/^\s+|\s+$/g, '');
});

这里使用了正则表达式。

通过为基本类型增加方法,可以极大地提高 JavaScript 的表现力。因为原型继承的动态本质,新的方法立刻被赋予所有的对象实例上(甚至包括那些在方法被增加之前的那些对象实例)

基本类型的原型是公用的,所以在使用其他类库时要小心。一个保险的做法是:只在确定没有该方法时才添加它。

Function.prototype.method = function (name, func) {
  if (!this.prototype[name])//没有该方法时,才添加
    this.prototype[name] = func;
  return this;
};


      

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

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