上文讲述过js实现面向对象,一定是能够实现继承的效果的。尽管说非常多的js框架都帮助我们实现了继承的功能。或者说在日常的工作和学习中我们压根就用不到js的继承,可是我们还是须要了解一下js中继承。以方便我们阅读框架中的继承是怎样实现的。在以下的文章中我会给大家模拟一下js中继承的实现。
先来看一下以下创建对象的一种方式:
/* * 对象工厂 */ function objectFactory(jsonObj){ function objectEntity(){ } if(typeof jsonObj == "object"){ for(var index in jsonObj){ objectEntity.prototype[index] = jsonObj[index]; } } return objectEntity; } var Person = objectFactory({ pname:'andy', sex:'man' }); var person = new Person(); console.info(person+"--"+Person);// [object Object] -- function objectEntity(){} console.info(person.pname); console.info(person.sex);objectFactory接受的是一个json对象jsonObj作为參数,在这个函数内部创建了一个函数objectEntity。然后就推断输入的jsonObj
是否是对象类型。假设是那么就遍历这个json对象,然后把遍历出来的每一个值都附加objectEntity的原型上面,请注意,以下返回的
就是objectEntity(能够參考上节中的js闭包概念),也就是说Person指向的就是objectEntity,那么Person的原型上面自然的就有了
pname,sex等属性。
假设上述可以理解的话,我们就行进行下一步的继承的实现(类似于非常多框架中的继承底层实现)
/* * 继承 */ function inherit(obj,prop){ function f(){ } if(typeof obj=="object"){ for(var index in obj){ f.prototype[index] = obj[index]; } }else{ f.prototype = obj.prototype; for(var index in prop){ f.prototype[index] = prop[index]; } } return f; } var Animal = inherit({ type:'animal', name:'animal', jump:'jump' }); var Dog = inherit(Animal,{ name:'i am a dog', jump:'dog jumpping' }); var dog = new Dog; console.info(dog.type); console.info(dog.name);
在这里就不再对inherit这个函数进行具体的解释,读者能够自行分析,在这里Dog 继承了Animal。那么Dog创建出来的对象dog自然的就有了Animal中的各个属性。