今天群里有位群友提了个问题,引起不小的讨论声。主要涉及到安全模式的应用,那今天就来学习一下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 关键字,队友当成方法调用了,这时依然可以创建一个实例对象。
总结:安全模式就是麻烦自己,方便他人的利他主义模式。