日期:2014-05-16  浏览次数:20397 次

js中模拟继承

//对象冒充
function FuncA(){
    this.name = 'A';
}

function FuncB(){
    this.method = FuncA;
    this.method();//不就等同于FuncA()么;
    delete this.method;
}
var a = new FuncA();
var b = new FuncB();
/*
alert(typeof a);
alert(typeof b);
alert(typeof FuncA);
alert(typeof FuncB);
*/
alert(b.name);



this.method()之中究竟做了哪些操作呢?

------解决方案--------------------
要理解这个就要先搞清楚this
换个例子

//对象冒充
function FuncA(){
    this.name = 'A';
    this.age=30;
}
 
function FuncB(){
    this.method = FuncA;
    this.method();//不就等同于FuncA()么;
    delete this.method;
    this.color ="red";
}
var a = new FuncA();
var b = new FuncB();
console.log(a.name);
console.log(b.name);

console.log(a.color);
console.log(b.color);


this.method();就是执行了A的构造函数,然后再删除,可以接着执行本身的构造函数,从而完成继承模拟。
------解决方案--------------------
给实例添加了一个name属性,并且设置name的值为A
------解决方案--------------------
this.method();//不就等同于FuncA()么;
错,是等同于FuncA.call(this);
直接执行FuncA里面的this因为作用域关系与外面的this指向不一致,将无法把name成员添加到当前对象,而会添加到window对象上去
其实可以写得更简单:
function FuncB(){
    FuncA.call(this);
}
你这点代码只是完成构造函数成员的继承,还要继承原型链上的成员才算圆满