js寄生组合继承中修改子类(暂且叫类)原型数组能影响父类的,为什么修改原型方法就不行呢?
//临时中转函数functionobj(o){functionF(){};F.prototype=o;returnnewF();}//寄生函数functioncreate...
//临时中转函数
function obj(o){
function F(){};
F.prototype=o;
return new F();
}
//寄生函数
function create(Box,Desk){
var f=obj(Box.prototype);
Desk.prototype=f;
f.construstor=Desk;
};
//父类
function Box(name,age){
this.name=name;
this.age=age;
};
//子类
function Desk(name,age){
Box.call(this,name,age);
};
//复用方法和属性
Box.prototype.run=function(){
return this.name+this.age+'运行中';
};
Box.prototype.sz=['1','2'];
//测试
create(Box,Desk);
var desk=new Desk('Jack',100); //实例化desk
var box=new Box('Tom',80); //box
alert(desk.run()); //Jack100运行中
alert(desk.construstor); //Desk
alert(desk.sz); //1,2
desk.sz.push('3'); //数组最后添加'3'
alert(desk.sz); //1,2,3
alert(box.sz); //1,2,3 本来是[1,2],由于是原型引用类型,受子类影响变成[1,2,3]
desk.__proto__.run=function(){ //
alert('gg');
}
desk.run(); //gg
alert(box.run()); // Tom80运行中 这里为什么不受子类的影响而上面的数据会受影响?
//给Desk原型添加一个新方法
Desk.prototype.carry=function(){
alert('TT');
}
desk.carry(); //TT
box.carry(); //空,添加Desk原型方法对Box原型也没影响
同样是引用类型,为什么数组有影响而方法没有呢? 展开
function obj(o){
function F(){};
F.prototype=o;
return new F();
}
//寄生函数
function create(Box,Desk){
var f=obj(Box.prototype);
Desk.prototype=f;
f.construstor=Desk;
};
//父类
function Box(name,age){
this.name=name;
this.age=age;
};
//子类
function Desk(name,age){
Box.call(this,name,age);
};
//复用方法和属性
Box.prototype.run=function(){
return this.name+this.age+'运行中';
};
Box.prototype.sz=['1','2'];
//测试
create(Box,Desk);
var desk=new Desk('Jack',100); //实例化desk
var box=new Box('Tom',80); //box
alert(desk.run()); //Jack100运行中
alert(desk.construstor); //Desk
alert(desk.sz); //1,2
desk.sz.push('3'); //数组最后添加'3'
alert(desk.sz); //1,2,3
alert(box.sz); //1,2,3 本来是[1,2],由于是原型引用类型,受子类影响变成[1,2,3]
desk.__proto__.run=function(){ //
alert('gg');
}
desk.run(); //gg
alert(box.run()); // Tom80运行中 这里为什么不受子类的影响而上面的数据会受影响?
//给Desk原型添加一个新方法
Desk.prototype.carry=function(){
alert('TT');
}
desk.carry(); //TT
box.carry(); //空,添加Desk原型方法对Box原型也没影响
同样是引用类型,为什么数组有影响而方法没有呢? 展开
展开全部
你这个弄的太复杂了,其实跟原型链没什么关系,只不过你代码中有个步骤把你搞蒙了,如果你把
desk.sz.push('3'); //数组最后添加'3'
改成
desk.sz = 1; //再次输出时box的还是[1,2], 而desk的就会是1了
只不过是push方法的问题。。。
更多追问追答
追问
试了一下,结果如你所说。不过还是不太明白,push操作不是读取desk.sz的指针对其指向堆内存进行操作吗?按这么说,为什么子类不能通过读取指针进行修改父类呢?
追答
这要从js的变量类型开始讲起,不知道你能不能听懂,其实是数组的一个特性。。
var a = [];
var b = a;
b.push(1);
console.log(a);//输出[1]
然而
var a = 1;
var b = a;
b++;
console.log(a);//输出1
你看,只有数组才会指向同一内存空间,那么继续看
var a = [];
var b = {};
console.log(typeof a);//输出object
console.log(typeof b);//输出object
因为数组是一个object+数组特有方法,也就是object的扩展,只有object类型的才会有原型链,指向同一个链接,同理,如果我上面的例子变成这样
var a = {};
var b = a;
b.c = 1;
console.log(a.c);//输出1
所以说,除了object类型的都是复制了一份,而不是指向同一块内存空间
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询