面向对象之 创建对象的安全模式

var Book = function(title,time,type){
    this.title = title;
    this.time = time;
    this.type = type;
}

var book = Book('JavaScrity','2019','js')

上面的示例你可能会觉得 book 这个变量应该是个实例吧.

我们用代码测试一下他是什么

console.log(book); //undefined

实际上是个 undefined ! 这是为什么呢?

我们来看一下这样的测试代码

console.log(window.title);   //JavaScript
console.log(window.time);  //2019
console.log(window.type);  //js

  明明创建了一个 Book 对象,并且添加了 title, time, type 这 3 个属性, 为什么会添加到 window 上面去了呢? 而且 book 这个变量还是 undefined. 因为实例化对象的时候 没有写 new 但是为什么会这样呢?

  new 关键字的作用可以看做是对当前对象的 this 不停地赋值, 然而例子中没有用 new, 所以会直接执行这个函数, 而这个函数在全局作用域中执行了, 所以在全局作用域中 this 的指向的当前对象自然是全局变量. 而我们这个页面的全局变量就是 window 了, 所以添加的属性自然会被添加到 window 上面了... 而我们的 book 变量最终的作用是要得到 Book 这个类(函数)的执行结果, 由于函数中么有 return 语句, 这个 Book 类自然不会告诉 book 变量的执行结果了, 所以就是 undefined(未定义).

为了避免这样的情况, 所以有了个叫做安全模式的东东:

var Book = function(title, time, type){
    //判断执行过程中的 this 是否是当前这个对象
    if(this instanceof Book){
        this.title = title;
        this.time = time;
        this.type = type;
    }else{
        return new Book(title, time, type);
    }
}

var book = Book('JavaScript','2019','js')

这个时候测试一下就是:

console.log(book);  //Book
console.log(book.title);  //JavaScript
console.log(book.time);  //2019
console.log(book.type);  //js
console.log(window.title);  //undefined
console.log(window.time);  //undefined
console.log(window.type);  //undefined
 

猜你喜欢

转载自www.cnblogs.com/evilr/p/11572012.html