详解js中extend函数
Posted 浴盆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解js中extend函数相关的知识,希望对你有一定的参考价值。
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函数所返回的是一个以给定对象为原型对象的空对象
以上是关于详解js中extend函数的主要内容,如果未能解决你的问题,请参考以下文章