JavaScript创建对象的安全模式

对于初学者可能不适应使用new关键字来创建对象实例,导致忘记使用new而犯错误,如果此时有人实时监测就可以解决了,所以赶快找一位"检察长"吧。比如,JavaScript在创建对象时有一种安全模式就可以解决这类问题。

1. 忘记使用new关键字会产生什么问题

// 图书类
var Book = function(title, time, type) {
    this.title = title;
    this.time = time;
    this.type = type;
};
// 实例化一本书
var book = Book('JavaScript', '2020', 'js');
console.log(book); // undefined
console.log(window.title); // JavaScript
console.log(window.time); // 2020
console.log(window.type); // js
示例中没有使用new,所以会直接执行这个类(函数),而函数在全局作用域中执行了,所以在全局作用域中this指向全局变量,在这个例子中全局变量就是window,所以添加的属性自然就添加到了window上面。由于类中没有return语句,则默认返回了undefined。

2.安全模式

// 图书安全类
var Book = function(title, time, type) {
    // 判断执行过程中this是否是当前这个对象的实例
    if(this instanceof Book) {
        this.title = title;
        this.time = time;
        this.type = type;
    }else { // 如果不是则使用返回new这个类后的实例
        return new Book(title, time, type);
    }
};
// 实例化一本书
var book = Book('JavaScript', '2020', 'js');
console.log(book); // Book {title: "JavaScript", time: "2020", type: "js"}
console.log(book.title); // JavaScript
console.log(book.time); // 2020
console.log(book.type); // js
console.log(window.title); // undefined
console.log(window.time); // undefined
console.log(window.type); // undefined

杜子李_
0 声望0 粉丝