如果使用 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; };
内容版权声明:除非注明,否则皆为本站原创文章。