发新贴  快速回复

继承问题

q1207526854
2014-04-06 22:14
 本帖最后由 q1207526854 于 2014-4-6 22:15 编辑 

<script type="text/javascript">

function A(){
    this.name = 'wangmeijian';
    this.age = 23;
}
A.prototype.showname = function(){
    alert( this.name )
}

function B(){
    A.call(this)
}

var a = new A()

B.prototype = new A()

B.prototype.showname=function()
{
    alert(this.age)
}

a.showname() //wangmeijian

var b = new B()

b.showname() //23

</script>把里面的
B.prototype = new A()改成
B.prototype = a之后的结果两个都弹出23,表示不解,原型不是引用关系吗,B修改了原型上的showname方法,开始A上的showname为什么没有受到影响?



王子
看一看原型链吧.
B.prototype = a;
B.prototype.showname=function()
{
        alert(this.age)
}
由于引用了同一片内存,实际上是修改了a对象的prototype,所以会弹出23

我瞎说的...
2014-04-08 00:12  回复本帖
王子
B.prototype = a; 
B.prototype.showname=function()  //这句,相当于  a.showname=function(){alert(this.age)}
{
        alert(this.age)
}
调用a.showname() 的时候,就会调用B.prototype.showname,于是弹出了23
2014-04-08 22:36  回复本帖
王子
B.prototype = new A();  //让B的原型对象指向A的实例
B.prototype.showname=function()  //给B的原型对象上添加一个showname方法
{
        alert(this.age) //弹出年龄
}

a.showname() //这儿调用的是A类的实例方法,弹出 'wangmeijian'
var b = new B()

b.showname() //23  这儿调用的B类的实例方法,弹出23
2014-04-08 22:42  回复本帖
子非鱼sun
我的理解是,B.prototype=new A(),和B.prototype=a都是是将一个A的实力赋给原型,但并不是同一个实例,即地址不同,所以前者不能改变a下的方法,后者和a是一个实例,改变的也就是a下的方法
2014-04-10 23:11  回复本帖
q1207526854
forum.php?mod=redirect&goto=findpost&pid=25240&ptid=7931
我的理解是,B.prototype=new A(),和B.prototype=a都是是将一个A的实力赋给原型,但并不是同一个实例, ...

非鱼兄,我不理解的是,a下的方法不是通过原型链找到A下面的方法吗?
2014-04-11 11:40  回复本帖
 
创美易-miaov
forum.php?mod=redirect&goto=findpost&pid=25256&ptid=7931
非鱼兄,我不理解的是,a下的方法不是通过原型链找到A下面的方法吗?

尼玛。。她是女的。。
2014-04-11 15:15  回复本帖
q1207526854
forum.php?mod=redirect&goto=findpost&pid=25262&ptid=7931
尼玛。。她是女的。。

不好意思,非鱼姐!鲸鱼,尼玛好尴尬
2014-04-11 16:27  回复本帖
子非鱼sun
 本帖最后由 子非鱼sun 于 2014-4-16 14:20 编辑 

forum.php?mod=redirect&goto=findpost&pid=25266&ptid=7931
不好意思,非鱼姐!鲸鱼,尼玛好尴尬

之前好像说错了。。。
function A(){
        this.name = 'wangmeijian';
        this.age = 23;
}
A.prototype.showname = function(){
        alert( this.name )
}

function B(){
        A.call(this)
}

var a = new A()

B.prototype = new A()

B.prototype.showname=function()
{
        alert(this.age)
}//这个地方的赋值,是给B的原型加一个属性,保存一个函数的地址,并不会改变A下面的showname
//当B.prototype=a;时,B.prototype.showname=a.showname,给a对象直接加了一个属性,保存一个函数的地址;其实这个时候A.prototype.showname应该还是存在的,没有改变。

a.showname() //wangmeijian

var b = new B()

b.showname() //23
2014-04-15 10:17  回复本帖
q1207526854
forum.php?mod=redirect&goto=findpost&pid=25449&ptid=7931
其实你完全可以简化下去理解:

a,b的原型指向A的两个不同的实例,但这两个实例的原型还是指向同一个地方,难道两个实例的原型用的不是构造函数上 的原型,而是复制 了一份作为自己的原型?
2014-04-16 10:54  回复本帖
子非鱼sun
forum.php?mod=redirect&goto=findpost&pid=25495&ptid=7931
a,b的原型指向A的两个不同的实例,但这两个实例的原型还是指向同一个地方,难道两个实例的原型用的不是 ...

之前好像误人子弟了。。不好意思哈~

alert(a.showname==A.prototype.showname);//你可以alert下,结果是false,说明,a.showname并不是原型下的,是后来添加在对象下的

2014-04-16 14:24  回复本帖
登录 后才可以发表回复