JS设计模式_利他主义的安全模式

今天群里有位群友提了个问题,引起不小的讨论声。主要涉及到安全模式的应用,那今天就来学习一下JavaScript的安全模式。

 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

很明显,这段代码想要创建一个Book对象,却没有new关键字。导致打印book变量时显示未定义,因为函数没有return声明返回值。

new关键字的作用是对当前this对象的不断赋值(即更新当前this的指向),然而上述代码没有使用new关键字,所以此时的this指向的当前对象是window,代码中声明的属性就被添加到window对象上。

JavaScript支持使用安全模式省略new关键字:

      var Book = function(title,time,type){
      	if(this instanceof Book){//判断this是否属于Book类型,如果是则说明是new创建的Book的一个实例对象
            this.title=title;
            this.time=time;
            this.type=type;
      	}else{
           return new Book(title,time,type);//非new创建的实例对象,重新创建一个实例对象
      	}				
      }
      var book=Book("HTML5","2020","web");
      console.log(book);//Book {title: "HTML5", time: "2020", type: "web"}
      console.log(window.title);//undefined
      console.log(window.time);//undefined
      console.log(window.type);//undefined

安全模式下代码逻辑先判断 this 的指向,然后通过 else 里的语句返回一个新创建的对象。

同样是通过 new 关键字创建对象,使用安全模式的代码却更加冗长,似乎显得很鸡肋。 这就不得不提到安全模式的作用:安全模式就是防止队友不知道你这写的是一个构造函数,没有使用 new 关键字,队友当成方法调用了,这时依然可以创建一个实例对象。

总结:安全模式就是麻烦自己,方便他人的利他主义模式。

猜你喜欢

转载自blog.csdn.net/weixin_38289787/article/details/107332052