视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JS继承之寄生式继承
2020-11-27 20:01:48 责编:小采
文档

一听到“寄生式继承”这个名词很容易产生畏难感,这是个什么东东呢?别急,本篇文章将尝试用通俗易懂的方式阐述JS中的这种继承方式,希望能帮助到大家。

一、一个例子

我们先定义一个空函数,形参是original,就像下面这样:

function createAnother(original){}

在该函数中创建一个新对象clone:

function createAnother(original){
 var clone=Object.create(original);
}

给clone对象增加属性sayHi,sayHi属性是一个函数:

function createAnother(original){
 var clone=Object.create(original); clone.sayHi=function(){
 alert('hi');
 };
}

最后,返回clone对象:

function createAnother(original){
 var clone=Object.create(original); clone.sayHi=function(){
 alert('hi');
 }; return clone;
}

假设我们有这样一个对象:

var person={
 name:'Nicholas',
 friends:['Shelby','Court','Van']
};

将以上对象作为实参传入我们的函数运行:

var anotherPerson=createAnother(person);
anotherPerson.sayHi();

运行结果是:将弹出’Hi’的窗口。

二、疑点:该方式与与原型式继承Object.create(o)有何区别?

我们看到,函数createAnother有这样一句:

var clone=Object.create(original);

这不就是原型式继承吗?
的确,这里确实在内部使用了原型式继承的方法,最后返回的就是clone对象。不过还是与原型式继承有点区别:
原型式继承继承了原对象的属性,新对象并没有新的额外属性;寄生式继承在内部就可以给新对象增加属性,新对象除了拥有原对象的属性,还拥有内部增加的属性。
以上例来说,相比于原型式继承,多出的关键语句:

 clone.sayHi=function(){
 alert('hi');
 };

创建一个实例后,该实例就拥有该属性。

下载本文
显示全文
专题