详解js中extend函数

来源:互联网 发布:澳门网络真人赌博游戏 编辑:程序博客网 时间:2024/05/16 10:16

extend详解

为了简化类的声明,可以把派生子类的整个过程包装在一个extend的函数,和其他语言中的extend关键字类似,基于一个给定的类结构创建一个新的类

   function extend(subClass, superClass){       var F = function(){ };       F.prototype = superClass.prototype;       subClass.prototype = new F();       subClass.prototype.constructor = subClass;   }

这样和原型链继承中直接使用subClass.prototype = new superClass()有什么区别呢,作为一项改进,它添加了一个空函数F,并将它创建的对象添加进原型链中,这样可以避免产生superClass的新实例,因为它可能比较庞大。下面是extend函数的使用场景:

   function Person(name){       this.name = name;   }   Person.prototype.getName = function(){       return this.name;   }   function Author(name, books){       //执行Person构造函数,获得Person对象中属性       Person.call(this, name);       this.books = books;   }   //获得Person原型上的方法,实现原型继承   extend(Author, Person);   //在Author原型上继续添加我们需要的方法   Author.prototype.getBooks = function(){       return this.books;   }

extend的改进

这样唯一的缺点是在Author构造函数中还出现了Person,耦合程度太高,所以我们需要对extend函数做一些改进

   function extend(subClass, superClass){       var F = function(){ };       F.prototype = superClass.prototype;       subClass.prototype = new F();       subClass.prototype.constructor = subClass;       subClass.superclass = superClass.prototype;       //修正原型的constructor指向       if(!superClass.prototype.contrucotor == Object.prototype.constructor){           superClass.prototype.constructor = superClass;       }   }   //使用中   function Author(name, books){       //从superClass.constructor中调用       Author.superClass.constructor.call(this, name)       this.books = books;   }   //获得Person原型上的方法,实现原型继承   extend(Author, Person);

clone函数

与基于类的继承不同,还有一种基于对象的原型式继承,不需要构造函数

   var obj = {       name: 'sysuzhyupeng',       say: function(){          alert(1);       }   }   var newObj = clone(obj);   newObj.name   // 'sysuzhyupeng'

来看一下clone函数的源码:

    function clone(object){        function F(){}        F.prototype = object;        return new F;    }

clone函数所返回的是一个以给定对象为原型对象的空对象

0 0
原创粉丝点击