求高手回答原型继承的问题

function Parent(firstName,color){
    this.firstName = firstName;
    this.color = color;
    this.showName = function (){
        console.log("我家姓氏:"+this.firstName);
    }
}
Parent.prototype.showAll=function(){
    console.log("姓:"+this.firstName+"\n"+"喜爱的颜色:"+this.color);
}
function Child(myName,age,firstName,color){
    this.myName = myName;
    this.age = age; 
    Child.prototype=Parent.prototype;
    Parent.call(this,firstName,color);
}
/*Child.prototype=Parent.prototype;*/

var c = new Child("帅",23,"孙","粉色");
var d=new Parent("孙","粉色");
d.showAll();//姓:孙
            //喜爱的颜色:粉色
c.showAll();//error c.showAll is not a function

call对象冒充为什么this不能获得构造函数Parent的原型?还有Child.prototype=Parent.prototype;写在Child函数里不行,为什么拿出来写在window环境就可以?
阅读 1.8k
2 个回答

题主:代码可以再捋一捋

Child.prototype=Parent.prototype    // Parent.prototype指向的是Object
Child.prototype=Parent    //该是这样吧

第一个问题:this不能获得构造函数Parent的原型

function Child() 定义一个函数,使用var c = new Child() this的指向为对象c,就没指向 Parent,不过你使用c.showName(),还是能获取到的,因为原型继承.

第二个问题:写在Child函数里不行,为什么拿出来写在window环境就可以?

写在函数里面也行的, this.prototype=Parent;
一个new做了以下几件事情:

  1. 创建一个新的对象

  2. 查找Childprototype上的所有方法、属性,复制一份给创建的对象

  3. 将构造函数Child内部的this指向创建的对象

  4. 创建的对象的__proto__指向Childprototype

  5. 执行构造函数

  6. 返回新创建的对象给变量c

写在内部就是在第五部写入,写在外部是在第四部写入,故与内外无关。

  1. 这种构造函数是获取不到Parent的圆形的,你使用call只是将被调用函数的this的指向,指向到当前的this,并没有修改Parent.prototype的指向.

  2. Child.prototype=Parent.prototype这句话不能写在构造函数的内部,你可以理解成当你new一个实例的时候Child.prototyppe刚开始是没有指向的你赋值给了他一个指向,可是当return这个新实例的对象之前,又会把你设定的原型指向覆盖掉了.操作函数的prototype必须放在函数外部.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题