我想要一种简单的方法来增强对象,通过添加任何其他对象的功能(S)。更重要的是,我需要一种方法,在一个干净的单行解决方案中从多个来源扩展对象。
继承是这样完成的:
function extend(proto, args){
this[proto.id] = Object.create(proto);
proto.constructor.call(this[proto.id], args);
}
extend.call(this, vehicle, args); // one-liner我可以根据需要调用尽可能多的对象;使用这种模式,很容易交换和更改原型链,所以我只需将上面的扩展代码放在vehicle对象中,如果我想要增强的话。
现在,只要你需要什么,就很容易制造出一辆车:
Extend.call(这,车辆,args);extend.call(这个,天窗,args);extend.call(这个,轮胎,args);extend.call(这个,机翼,args);extend.call(这个,火箭,args);等等。
问题:
id属性,因此扩展函数知道如何在正在执行的上下文中创建一个属性。好像是黑客。有办法从命名的构造函数中获取原型名称吗?var制造商={id:‘制造商’,构造函数: function (args) { this.boss = args.boss欧元/ 'Bernie Ecclestone';this.country = args.country 'UK';返回此;};var vehicle ={ id:'vehicle',构造函数: function (args) { this.colour = args.colour连体\ 'blue';this.wheels = args.wheels \x\x\ 2;Extend.call(此,制造商,args);返回此;};var驱动程序={id:‘console.log’,函数(args) { this.name = args.name args.name 'John';返回此;},info : function () { console.log(this.name);};};var engine ={ id:'engine',构造函数: function (args) { this.type = args.type连用'V6';this.fuel = args.fuel欧元/‘汽油’;返回此;},调音: function () { this.type =‘超级充电’;this.fuel =‘乙醇’;console.log('Car now‘+ this.type +’和‘+this.fuel’);} };var car ={ id:'car',构造函数:函数(args) {extend.call(此,vehicle,args);extend.call(此,驱动器,args);extend.call(此,引擎,args);返回此;},info : function () { console.log('boss:‘+ this.vehicle.manufacturer.boss);console.log('country:‘+ this.vehicle.manufacturer.country);console.log('driver:’+ this.driver.name);console.log(颜色:‘+ this.vehicle.colour);console.log(’轮子:‘+ this.vehicle.wheels);console.log(’类型:‘+ this.engine.type);console.log(’燃料:‘+ this.engine.fuel);console.log('\n');};函数扩展(proto,args){ thisproto.id = Object.create(proto);proto.constructor.call(thisproto.id,args);Object.create(car).constructor({ boss:'Maurizio Arrivabene‘),国家:’意大利‘,名称:'Steve',颜色:’红色‘,轮子: 4,类型:’100 car‘,燃料:’柴油‘};({ name:'Jenson Button’});瓦尔麦克拉伦=Object.create(汽车).constructor({ type:‘混合动力,燃料:’电池/汽油‘};ferrari.engine.tune();ferrari.info();/*汽车现在对乙醇的超级充电: Maurizio Arrivabene国家:意大利司机:史蒂夫颜色:红色车轮:4种:超级燃料:乙醇*/ lotus.info();/*老板:伯尼埃克莱斯顿国家:英国司机:简森按钮颜色:蓝色车轮:2种: V6燃料:汽油*/ mclaren.info();/*老板:伯尼·埃克尔斯通国家:英国司机:约翰·色彩:蓝色车轮:2型:混合燃料:电池/汽油*/
发布于 2016-01-06 02:21:19
非常有趣的概念,我可以看到这变成了一个“皮条客我的骑行”游戏。在发送给游戏玩家之前,有几件事:
你好像误解了OOP的意义。实际上,您有很多变量(而不是对象),然后将它们合并到一个最终的概念( car)中。
如果你想让它更面向面向对象,下面是我的一些建议:
除去所有的变量,除了car。保留这个,因为它将代表您的“对象”。而不是制造商有自己的变量(谁知道,也许有些汽车将定制或有各种制造商),使用setter和设置器来定义汽车的属性。把它想象成这样:
Car object {
Initialize the object here
get manufacturer() {
}
set manufacturer(string or array or object) {
}
}现在,如果您用getter和setter实现每个细节,那么您的代码在这里可能会变得很大。有时您可以管理这一点,而其他时候则不然,这样您可能会将事情分解:让制造商在引擎对象中得到/设置,而汽车只为引擎设置get/set。
就像其中一条评论说的,你应该研究对象原型。关于以面向对象的方式进行JavaScript编程的新起点,阅读Mozilla的文档。
我不相信拥有Ferrari变量和lotus变量是实现创建cars的最佳方法。我建议一个新的对象,可能是CarColection或Garage,并创建/检索/存储/拉皮条您的汽车。它将允许以后的变化,或动态修改的汽车。
纯粹是为了好玩和家庭作业:加上能力,指定排气,变速器,轮胎,驾驶技能等,然后计算马力/汽车的水平。很快你就可以在比赛中挑战汽车了!:)
https://codereview.stackexchange.com/questions/101612
复制相似问题