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原型也没影响

同样是引用类型,为什么数组有影响而方法没有呢?
展开
 我来答
s524797336
2016-10-31 · TA获得超过180个赞
知道小有建树答主
回答量:126
采纳率:100%
帮助的人:188万
展开全部

你这个弄的太复杂了,其实跟原型链没什么关系,只不过你代码中有个步骤把你搞蒙了,如果你把

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类型的都是复制了一份,而不是指向同一块内存空间

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式