欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS继承实例讲解之寄生式继承

程序员文章站 2023-11-15 23:04:28
一听到“寄生式继承”这个名词很容易产生畏难感,这是个什么东东呢?别急,本篇文章将尝试用通俗易懂的方式阐述js中的这种继承方式。 一、一个例子 我们先...

一听到“寄生式继承”这个名词很容易产生畏难感,这是个什么东东呢?别急,本篇文章将尝试用通俗易懂的方式阐述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');
    };

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