忘记写new怎么办

    如果一个函数被定义为用于创建对象的构造函数,但是调用时忘记了写 new 怎么办?

    在strict模式下, this.name = name 将报错,因为 this 绑定为 undefined ,在非strict模式下, this.name = name 不报错,因为 this 绑定为 window ,于是无意间创建了全局变量 name ,并且返回 undefined ,这个结果更糟糕。

    所以,调用构造函数千万不要忘记写 new 。为了区分普通函数和构造函数,按照约定,构造函数首字母应当大写,而普通函数首字母应当小写,这样,一些语法检查工具如 jslint 将可以帮你检测到漏写的 new

    最后,我们还可以编写一个 createStudent() 函数,在内部封装所有的 new 操作。一个常用的编程模式像这样:

    function Student(props) {

    this.name = props.name || '匿名'; // 默认值为'匿名'

    this.grade = props.grade || 1; // 默认值为1

    }



    Student.prototype.hello = function () {

    alert('Hello, ' + this.name + '!');

    };



    function createStudent(props) {

    return new Student(props || {})

    }

    这个 createStudent() 函数有几个巨大的优点:一是不需要 new 来调用,二是参数非常灵活,可以不传,也可以这么传:

    var xiaoming = createStudent({

    name: '小明'

    });



    xiaoming.grade; // 1

    如果创建的对象有很多属性,我们只需要传递需要的某些属性,剩下的属性可以用默认值。由于参数是一个Object,我们无需记忆参数的顺序。如果恰好从 JSON 拿到了一个对象,就可以直接创建出 xiaoming