JS编程建议——19:不要使用类型构造器

建议19:不要使用类型构造器
在默认状态下,JavaScript预定义了很多构造函数,如Function()、Array()、Date()、string()等,如果去掉小括号,它们就是JavaScript内置对象。在JavaScript中,构造函数实际上就是类的一种抽象结构。
利用new运算符调用构造函数,可以快速生成很多实例对象。例如:

  1. var f = new Function(p1, p2, ..., pn, body);
    其中构造函数Function()的参数类型都是字符串,p1~pn表示所创建函数的参数名称列表,body表示所创建函数的函数结构体语句,在body语句之间通过分号进行分隔。可以完全省略所有参数,仅为构造函数传递一个字符串,用来表示函数的具体结构。f就是所创建函数的名称。例如:
  2. var f = new Function("a", "b", "return a+b");
    使用new Function()的形式来创建一个函数不是很常见,因为一个函数体通常会包括多条语句,如果将这些语句以一个字符串的形式作为参数来传递,代码的可读性会很差。类似的用法还有:
  3. new Boolean(false)
    new运算符调用函数会返回一个对象,该对象有一个valueof方法,同时返回被包装的函数,其实这是完全没有必要的,并且有时还令人困惑。不要使用new Boolean、new Number或new String。此外,应该避免使用new Object和new Array,可以使用{}和[]来代替。

在其他语言中,构造函数一般没有返回值,它只是初始化由this关键字所指代的对象,并且什么都不返回。但是,JavaScript构造函数可以返回一个对象,返回的对象将成为new运算符的运算值,此时this所引用的对象就会被覆盖。

  1. function F(){
  2. this.x = 1;
  3. return { y : 2 };
  4. }
  5. var f = new F();
  6. f.y; // 2
    上面示例演示了如何使用返回的对象覆盖构造函数的实例对象,但是,如果返回值是原始值时,就不会覆盖实例化对象,此时按着普通函数的方式调用构造函数就可以得到返回值。 例如:
  7. function F(){
  8. this.x = 1;
  9. return true;
  10. }
  11. var f = new F();
  12. f.x; // 1
  13. F(); // true
    因此,如果构造函数的返回值为对象,可以直接调用构造函数来引用该返回值对象,而不需要使用new运算符来运算。
上一篇:HDU-7111 Remove 单调队列优化DP 贪心


下一篇:机器学习中的贝叶斯方法---当后验分布无法计算时如何求得预测模型?