简要谈论js

首先我们来看看这段代码

let _ = function (obj) {
    if (obj instanceof _) return obj;
    if (!(this instanceof _)) return new _(obj);
    this._wrapped = obj;
}
这是摘录自underscore中的部分代码,我们知道定义一个函数,通常情况下是使用var _ = function(){...}
使用函数方法,我们通常会new一个实例出来,var _ = new _()这样才能获取到函数内定义的其他属性或是方法
但一旦我们在使用函数没有new的时候,比如:
var a = function(){this.a = 'zhangsan';this.b = function(){return this.n};} 
console.log(a.a)//这样外部的a会是一个Function对象,对象中的a是不存在的,故而返回undefined;
var b = new a;
console.log(b.a)//这样通过new出来的一个a函数的实例对象,现在a函数的实例对象下就有a这个值得存在了,故而返回‘zhangsan’
当然,a中的函数也是同样的道理,然后就上面的代码而言,我们要想调用a函数内部的f方法就必须得先new一个a的实例才能通过实例调用f方法
但是,我们把a函数改写下 
var a = function(obj){
this.a = 'zhangsan';
this.b = function(){
return this.n
};
//通过直接调用a函数方法,判断是否是该函数方法的实例,若不是实例,则return一个该函数的实例方法
if(obj instanceof a) return obj;
if(!(this instanceof a)) return new a(obj);
}
这样改写后,我们就可以不通过new来构造一个实例才去调用f方法了直接执行a().f() // 输出‘zhangsan’
这就避免了函数方法在调用时必须要使用实例的情况

 

百度已收录
分享