javascript  oop编程  — 实现继承的三种形式[1]


(1)模拟类的方式, 我们都知道js是原型继承机制,不存在class和instance分离的这种方式

假设,我们有两个类


function  Animal(){

this.name = “animal”;

this.eat = function(){

consle.log(“eating");

 }

 }


function Cat(){

this.say = function(){

console.log(“miao miao!!");

 }

 }


如果我们想要Cat 拥有Animal 的name属性和eat方法,只需要

Cat.prototype = new Animal();

但是这不是一个好的实践,想想看,如果还有一个Duck类,难道还要new一个Animal来继承吗,如此继续吗?

正确的作法是将通用的内容放到prototype里面,所有的子嗣,只需要将自己的prototype指向一个通用的prototype来实现继承。


如下,

Animal.prototype = {

name:”animal”,

eat:function(){

console.log(“eating");

 }

 }


Cat.prototype = Animal.prototype;


ES5 为我们提供了一个通用的继承函数,通过一个指定的原型创建一个对象

Object.create   很遗憾并不是所有浏览器都支持,手工改一下


var inherit = Object.create || function(proto){

        function F(){};

F.prototype = proto;

return new F

 }


上面的例子可以写成


Cat.prototype = inherit(Animal.prototype);

——————————

上面这样做,会出现Cat.prototype = F 的情况,我们需要拨乱反正,不如再写一个封装,专门来实现继承


var  extend = function(Child,Parent){

Child.prototype = inherit(Parent.prototype);

Child.prototype.constructor = Child;

 }