比如我们这样的实例化:let cup = Cup('iron', 'plastic', 'rubber')复制代码当我们没有加上new的时候,编译器并不会提示(弱类型的特点),而且由于Cup本身就是一个函数,所以在使用的时候,也可以正常运行。
但是当我们cup此时肯定不是Cup类的,显而易见,当我们把Cup当作一个函数执行的时候,cup的值取决于函数的返回。
这里没有返回,所以是undefined。
那么我们执行完这个Cup()函数后,造成了什么影响呢?答案是Cup的属性绑定到了全局变量上。
对于浏览器来说就是windowcup.cupCover // undefinedwindow.cupCover // "iron"复制代码所以,我们该如何避免这种情况发生呢?我们可以稍稍改造一下Cup构造函数:function Cup(cupCover, cupBody, cupBottom) { if(this instanceof Cup) { this.cupCover = cupCover this.cupBody = cupBody this.cupBottom = cupBottom } else { return new Cup() }}复制代码这样当我们再次不小心执行let cup = Cup(‘iron’, ‘plastic’, ‘rubber’)时,由于此时的this并不是Cup的派生类,所以我们直接返回一个实例。
let cup = Cup('iron', 'plastic', 'rubber')cup.cupCover // "iron"复制代码而这种形式的构造函数,就是今天要说的安全模式的构造函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)