JavaScript中的继承之寄生式继承

寄生式(parasitic)继承是与原型式继承紧密相关的一种思路。

寄生式继承的思路与寄生构造函数和工厂模式类似(这里提到的寄生构造函数和工厂模式都是创建对象的方法,有时间会写博客),即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象。最后再像真的是它做了所有工作一样返回对象。

还是要用之前的object函数:

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

以下代码示范了寄生式继承。

function createAnother(original){
    var clone = object(original);     //通过调用函数object创建一个新对象
    clone.sayHi = function(){     //以某种方式来增强这个对象
        alert("hi");
    };
    return clone;    //返回这个对象
}

  在这个例子中,createAnother()函数接受一个参数,也就是将要作为新对象基础的对象。然后把这个对象(original)传给object()函数,将返回的结果赋值给clone。此时,original的实例属性和实例方法变成clone对象的原型属性和原型方法。接着再为clone对象添加一个新方法sayHi(),最后返回clone对象。可以像下面这样来使用createAnother()函数。

var person = {
    name: "Nico",
    friends: ["Shelby","Court","Van"]
};

var anotherPerson = createAnother(person);
anotherPerson.sayHi();    //‘hi‘

上述代码基于person返回了一个新对象——anotherPerson。新对象不仅具有person的所有属性和方法(person的属性和方法都被添加到anotherPerson原型对象上),而且还有自己的sayHi()方法。

在主要考虑对象而不是自定义类型和构造函数的情况下,寄生式继承也是比较有用的。前面示范继承模式时使用的object()函数不是必须的。任何能够返回新对象的函数都适用于此模式。

但是,使用寄生式继承来为对象添加函数,会由于做不到函数复用而降低效率。这一点与构造函数类似。  

时间: 2024-12-22 07:34:29

JavaScript中的继承之寄生式继承的相关文章

JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承

说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象JS基础讲解,工厂模式.构造函数模式.原型模式.混合模式.动态原型模式>,接下来讲一般通过那些方法完成JavaScript的继承. 原型链 JavaScript中实现继承最简单的方式就是使用原型链,将子类型的原型指向父类型的实例即可,即“子类型.prototype = new 父类型();”,实现方法如下

[js高手之路]原型式继承与寄生式继承

一.原型式继承本质其实就是个浅拷贝,以一个对象为模板复制出新的对象 1 function object( o ){ 2 var G = function(){}; 3 G.prototype = o; 4 return new G(); 5 } 6 var obj = { 7 name : 'ghostwu', 8 age : 22, 9 show : function(){ 10 return this.name + ',' + this.age; 11 } 12 }; 13 var obj2

JavaScript之面向对象学九(原型式继承和寄生式继承)

一.原型式继承 该继承模式是由道格拉斯*克罗克福德在2006年提出的实现继承的方法. 模式的基本思路:借助原型可以基于已有的对象创建新的对象,同时还不必因此创建自定义类型. 代码如下: function object(o) { function F() { //定义一个F类型的对象 this.name="111"; } F.prototype=o;//使F的原型对象指向传入对象,也就是说F继承了传入的对象,也相当于用传入的对象重写了F的原型对象 相当于如下代码 /* F.prototy

JavaScript ES5类 原型 原型链 组合、原型、寄生式继承

ES5类 原型  原型链 继承 JavaScript中,原型是相对于构造函数(类)的叫法(或者说概念),原型链是相对于构造函数(类)的实例对象的叫法. 对于JavaScript对象,如果在对象自身上找不到该属性,那么就会向上沿着原型链继续查找该属性 创建一个ES5类 在ES5中,类是由函数名首字母大写的函数,通过关键字new创建的. 类的构造函数就是函数自身 一般情况下,ES5类的原型对象prototype是自身构造函数,该类的实例化对象的原型链对象__proto__也是该构造函数,这二者指向同

JavaScript中的继承之寄生组合式继承

先说说组合继承.最常用的继承方式组合继承,其最大的问题是无论在什么情况下,都会调用两次超类型的构造函数:一次是在创建子类原型的时候,另一次是在子类型构造函数内部. 组合继承是通过原型继承方法和原型属性,构造函数继承实例属性.但子类通过原型也继承了超类型的全部实例属性(方法暂且不说),即超类的实例属性成为子类的原型属性,所以不得不在调用子类构造函数时重写这些属性.也就是说在子类的原型对象上继承来自超类的实例属性完全是多余的. 看一个组合继承的例子. function SuperType(name)

JavaScript ----------------- 寄生式继承

寄生式继承 寄生式继承是于原型式继承紧密相关的一种思路.寄生式基础的思路与寄生构造函数和工厂模式类似,既创建一个仅用于封装继承过程的函数,该函数内部以某种方式来增强对象,最后再像真地是它做了所有工作一样返回对象. 以下代码示范了寄生式继承模式. function object(o){  function F(){ } F.prototype=o;  return new F(); }; function createAnother(original){ var clone = object(or

JavaScript之原型式继承&amp;寄生式继承和寄生组合式继承以及优缺点

一.原型式继承 1.这种方法并没有使用严格意义上的构造函数,借助原型可以基于已有的对象创建新的对象 function object(o) { function F() {} F.prototype = o; return new F(); } // 在object()函数内部,先创建一个临时性的构造函数,然后将传入的对象作为这个构造函数原型,最后返回了这个临时类型的一个新实例. // object()本质上对其中传入的对象进行了一次浅复制 // 看如下的例子: var person = { na

JS继承 -- 寄生式继承 &amp; 寄生组合式继承

5.寄生式继承 与寄生构造函数和工厂模式类似,创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回对象. function createAnother(original){ var clone = Object.create(original); //通过调用函数创建一个新对象 clone.sayHi = function(){ //以某种方式来增强这个对象 alert("Hi"); }; return clone; //返回这个对象 } var person

寄生式继承

//寄生式继承是原型继承密切相关的一种思路,.寄生式继承的思路与寄生构造函数和工厂模式类似,即创建一个仅用于封装继承过程//的函数,该函数在内部以某种方式来增强对象, function object(o){ function F(){} F.prototype = o; F.name = "shalio";} function createAnother(original){ var clones = object(original); clones.sayHi = function(