【发布时间】:2014-03-27 09:35:49
【问题描述】:
首先大家好,对不起我的英语。
我仍然会利用这个社区的专业知识和可用性。
在此期间,我正在研究 javascript、Crockford 模式、deepcopy shallowCopy 等中的继承。
我也在 stakoverflow (here,here ecc..) 中阅读了很多帖子,但我并不掩饰我的疑虑仍然很多。
我的目标是在不使用 jquery 或方法作为 objectCreate 的情况下创建一种伪多重继承。
伪,因为正如我从阅读各种帖子中了解到的那样,javascript 中的多重继承不存在。
在我的脚本中有两个“超类”(HomoErectus 和 HomoSapiens)和一个“子类”(ModernMan)。
我的 copyProtoDeep 函数将超类原型的所有属性复制到子类的原型中。
此函数接受不定数量的参数,第一个参数是从函数调用中指定的其他类继承的类。
如果 copyProtoDeep 找到对象或数组,为了避免浅拷贝,该函数会克隆此元素。
也就是说,如果可能的话,我想回答以下问题。
我的代码正确吗?
这种类型的 ineritance 是 mixin 吗?
这个过程有哪些负面(或缺点)?
uber的使用正确吗?
我可以改进我的代码吗?
我知道我的问题可能对于单个帖子来说太多了,但我也会很高兴地阅读部分回复。
在此先感谢大家
<script type="text/javascript">
function copyProtoDeep() {
var len = arguments.length;
arguments[0].prototype.uber=[]
for (j = 1; j <len; j++) {
var parent = arguments[j].prototype;
var child = arguments[0].prototype;
for (var i in parent) {
if (parent.hasOwnProperty(i)) {
if (typeof parent[i] === 'object') {
child[i] = Array.isArray(parent[i]) ? parent[i].slice(0) : JSON.parse(JSON.stringify(parent[i]));
} else {
child[i] = parent[i];
}
}
}
child.uber[j] = arguments[j].prototype
}
}
function HomoErectus(name){
this.name=name
this.sayHello=function(){return 'Hello from '+this.name}
}
HomoErectus.prototype.discovery='fire'
HomoErectus.prototype.scream='yabadabadoo'
HomoErectus.prototype.friends=['wilma','Betty','Barney']
HomoErectus.prototype.uberTest1=function(){
if(this.uber){return 'the ancestor of '+this.name+" discovered "+this.uber[1].discovery}
else{return this.name+' discovered '+this.discovery}
}
function HomoSapiens(name){
this.name=name
this.iam=function(){return 'I am an Homosapiens an my name is '+this.name+' and my weapons are '+this.dangerousWeapons.w1}
}
HomoSapiens.prototype.discovery='wheel'
HomoSapiens.prototype.dangerousWeapons={w1:'bow and arrows',w2:'Spear and shield'}
HomoSapiens.prototype.uberTest2=function(){if(this.uber){return 'yes yes'}else{return 'no no'}}
function ModernMan(){
HomoErectus.apply(this, arguments);
HomoSapiens.apply(this, arguments);
}
copyProtoDeep(ModernMan, HomoErectus,HomoSapiens)
ModernMan.prototype.discovery='pc'
var fred=new HomoErectus('Fred')
console.log(fred.uberTest1())
var bubba=new HomoSapiens('Bubba')
console.log(bubba.uberTest2())
var john = new ModernMan('John')
john.friends.push('Riky')
john.dangerousWeapons.w3='guns and bombs'
console.log(john.uber[1].friends)
console.log(john.uber[2].dangerousWeapons)
console.log(john.uberTest1())
console.log(john.uberTest2())
</script>
【问题讨论】:
-
为什么 javascripters 如此讨厌组合,他们使用这样的廉价技巧?有了这种助手,人们几乎无法控制什么被覆盖或不被覆盖。假设一个人想要发现智人的直立人朋友……猜猜看,助手根本没有帮助。策略会解决这个问题。
标签: javascript oop inheritance