在构造函数中使用严格模式,并直接调用构造函数

1 function Fubar(foo, bar){
2   'use strict';
3   this._foo = foo;
4   this._bar = bar;
5 }
6 
7 Fubar()
8 // TypeError: Cannot set property '_foo' of undefined

如果没有严格模式,构造函数中的this指向全局对象;

有严格模式时,this默认为undefined而不是指向全局对象;

如果此时直接调用构造函数,语句 this.-foo=foo; 相当于为“undefined”添加属性,所以会报错。

 

 1 function Fubar(foo, bar) {
 2   if (!(this instanceof Fubar)) {
 3     return new Fubar(foo, bar);
 4   }
 5 
 6   this._foo = foo;
 7   this._bar = bar;
 8 }
 9 
10 Fubar(1, 2)._foo // 1
11 (new Fubar(1, 2))._foo // 1

目的:没有使用new来调用构造函数时,返回一个用new创建的构造函数实例。

过程:

this是否指向构造函数实例?

上述句子等同于:是否使用了new?

是,对true取反后为假,则不执行if内的语句;

否,对false取反后为真,执行if内语句。

结果是未使用new时,执行if内的语句。

 

posted @ 2021-01-25 15:14  呈心者  阅读(105)  评论(0编辑  收藏  举报