prototype中继承的问题?

探讨JavaScript中使用prototype进行继承时,如何确保每个实例拥有独立的属性副本,避免共享同一引用。
最近在学习prototype.js代码,想利用其中的继承来学习一下javascript中的oo思想。碰见到了一些问题,如下

/*
* 第一种方法,不使用prototype的继承
* 这是以前在学习继承时使用的继承方法,
*/
function d(ui){
if(!ui){
return;
}
this.param1 = document.createElement(ui);
}

function e(ui){
if(!ui){
return;
}
this.base = d;
this.base(ui);
this.param2 = document.createElement(ui);
}
e.prototype = new d();

function f(ui){
if(!ui){

}
this.base = e;
this.base(ui);
}
f.prototype = new e();

var e1 = new e("div");
var e2= new e("div");
var f1 = new f("div");
var f2 = new f("div");
//能够拿到不同的param1对象
alert(e1.param1 ==e2.param1); //返回false
alert(f1.param2 == f2.param2);//返回false

/*
* 第二种方法,使用prototype继承
*/

var a = Class.create();
a.prototype = {
initialize:function(ui ){
this.param1 = document.createElement(ui);
}
}

var b = Class.create();
b.prototype = Object.extend(new a(),{
initialize:function(ui){
this.param2 = document.createElement(ui);
}
})

var c = Class.create();
c.prototype = Object.extend(new b(),{
initialize:function(param){
}
})

var b1 = new b("div");
var b2= new b("div");
var c1 = new c("div");
var c2 = new c("div");
//这里本意是每一个对象都能拿到自己的一个param1的属性
//但是这里拿到的是同一个引用
alert(b1.param1 == b2.param1);//return true
alert(c1.param2 == c2.param2);//return true


我的问题是我想用prototype的方法实现第一种代码的实现,在继承后,子类能拿到自己的在父类中param1对象,但是却发生了第二种代码的情况,这应该是由prototype中继承机制导致的,prototype中继承代码如下:


Object.extend = function(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
return destination;
}
//继承实现时如:
b.prototype = Object.extend(new a(),{}}


我参照ajax.base中形式改进了第二种方法如下:

/*
*第三种方法
*/
var a = Class.create();
a.prototype = {
initialize:function(param){
this.init(param);
},
init:function(param){
this.param1 = document.createElement(ui);
}
}

var b = Class.create();
b.prototype = Object.extend(new a(),{
initialize:function(param){
this.init(param);
this.param2 = document.createElement(ui);
}
})

var c = Class.create();
c.prototype = Object.extend(new b(),{
initialize:function(param){
//this.init(param);
}
})
var b1 = new b("div");
var b2= new b("div");
var c1 = new c("div");
var c2 = new c("div");

alert(b1.param1 == b2.param1);//return false
alert(c1.param2 == c2.param2);//return true


第三种方法我用一个init方法在每个对象中给param1赋值,这样每个子类能拿到不同的param1对象,但是这样多重继承后设置子类的属性时非常的不方便,请问有什么改进的方法吗?
乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值