为什么CopyFun构造函数通过new 可以继承来自Fun的属性?

function Fun() {
    this.name = "mary";
    this.sec = function () {
        console.log("sec");
    }
}

function CopyFun() {
    // Fun.call(this);
    this.fun = Fun;
    this.fun();
}

var fun = new CopyFun();

fun.sec();  // sec
console.log(fun.name);  // mary
console.log(fun.hasOwnProperty("sec"));  // true

为什么CopyFun中this.fun()方法执行就可以创建属性?

我是这样理解的:

this.fun = function(){
    this.name = "mary";
    this.sec = function () {
        console.log("sec");
    }
}

当执行 this.fun() 这一步时应该是一个正常函数的调用,由于没有返回值所以应该返回undefined。

但实际情况是,它相当于执行了Fun.call(this),创建的属性name和sec,这一点不能理解,望哪位大神给解释一下,谢谢!!!。

阅读 2.4k
2 个回答

其实你加个console.log看看this就知道了。

function Fun() {
    console.log(this);
    this.name = "mary";
    this.sec = function () {
        console.log("sec");
    }
}

this.fun()的确没有返回值(怎么理解这个正常函数调用呢?这里我认为是在调用实例的fun方法了,所以fun方法里面的this指向的是实例),但它执行体里 this指向的就是CopyFun的实例,那么this.name等就是在给实例赋值成员了。

this.fun()这句语句里面this即实例fun对象,调用了Fun函数,因此,此时Fun函数里的this也是实例fun对象。所以产生了和执行Fun构造函数类似的效果。

在构造函数的返回问题上,题主有2个认识上的误区:

  1. this.fun()确实返回undefined,然而没有变量或语句去接收返回值,这个返回值相当于被抛弃了。

  2. 另外在执行new操作的时候,如果没有显示指定一个return ,或者return的不是引用类型的数据,会默认返回this,即该构造函数创建出来的实例对象。

推荐问题