美文网首页
【面向对象的程序设计(3)】原型链继承

【面向对象的程序设计(3)】原型链继承

作者: Wonder233 | 来源:发表于2017-11-17 11:47 被阅读0次

ECMAScript只支持实现继承(继承实际的方法),主要依靠原型链来实现。

原型链

基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。

function SuperType(){
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    return this.property;
};

function SubType(){
    this.subproperty = false;
}

//继承了SuperType
SubType.prototype = new SuperType();

SubType.prototype.getSubValue = function(){
    return this.subproperty;
};

var instance = new SubType();
alert(instance.getSuperValue());   //true

实现的本质是重写原型对象,代之以一个新类型的实例。

即,原来存在于SuperType的实例中的所有属性和方法,现在也存在与SubType.prototype中了。
确定了继承关系之后,给SubType.prototype添加了一个方法,这样就在继承了SuperType的属性和方法的基础上又添加了一个新方法。

子类型有时要覆盖超类型中的某个方法,或者需要添加超类型中不存在的某个方法。
——给原型添加方法的代码一定要放在替换原型的语句之后。

function SuperType(){
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    return this.property;
};

function SubType(){
    this.subproperty = false;
}

//继承了SuperType
SubType.prototype = new SuperType();

//添加新方法
SubType.prototype.getSubValue = function(){
    return this.subproperty;
};
//重写超类型中的方法
SubType.prototype.getSuperValue = function(){
    return false;
};

var instance = new SubType();
alert(instance.getSuperValue());  //false

通过原型链实现继承时,不能使用对象字面量创建原型方法,因为这样做会重写原型链。

function SuperType(){
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    return this.property;
};

function SubType(){
    this.subproperty = false;
}

//继承了SuperType
SubType.prototype = new SuperType();

//使用字面量添加新方法,会导致上一行代码无效
SubType.prototype = {
    getSubValue : function(){
        return this.subproperty;
    }
};

var instance = new SubType();
alert(instance.getSuperValue());  //error

缺点:
1、包含引用类型值的原型的继承会出问题。

function SuperType(){
    this.color=["red","blue","green"];
}

function SubType(){
}

//继承了SuperType
SubType.prototype = new SuperType();

var instance1 = new SubType();
instance1.color.push("black");
alert(instance1.color);         //"red,blue,green,black"

var instance2 = new SubType();
alert(instance2.color);         //red,blue,green,black

2、创建子类型的实例时,没有办法在不影响所有对象实例的情况下,给超类的构造函数传递参数。


实践中会很少单独使用原型链!!!

相关文章

  • JavaScript面向对象程序设计

    JavaScript面向对象程序设计本文会碰到的知识点:原型、原型链、函数对象、普通对象、继承 读完本文,可以学到...

  • 全方位理解JavaScript面向对象

    JavaScript面向对象程序设计 本文会碰到的知识点:原型、原型链、函数对象、普通对象、继承 读完本文,可以学...

  • lesson 5 面向对象及原型链 2021-04-29

    课程标题 面向对象及原型链 课程目标 面向对象思想 原型及原型链 继承 知识点 面向对象思想 原型链的指向 new...

  • JS汇总---面向对象&数组

    面向对象 js原型链的继承 静态属性怎么继承 js原型链以及特点 面向对象有哪几个特点 封装,继承,多态 对象的继...

  • JavaScript面向对象的程序设计

    目录 导语 1.理解对象和面向对象的程序设计 2.创建对象的方式 3.JavaScript的继承机制 3.1 原型...

  • es5的部分继承以及es6的class

    一、JavaScript常用的原型继承方式 原型链继承 2,构造函数继承(对象冒充继承) 3,组合继承(原型链继承...

  • Javascript 继承

    参考:JavaScript高级程序设计(第3版) 原型链 原型式继承 寄生式继承 寄生组合式继承

  • 【面向对象的程序设计(3)】原型链继承

    ECMAScript只支持实现继承(继承实际的方法),主要依靠原型链来实现。 原型链 基本思想:利用原型让一个引用...

  • Javascript继承的原理

    JavaScript的继承是通过原型链继承,与传统面向对象的继承方式不同。 prototype与原型 我们从头开始...

  • 面向对象(三)

    内容承接 面向对象(二) 继承 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本...

网友评论

      本文标题:【面向对象的程序设计(3)】原型链继承

      本文链接:https://www.haomeiwen.com/subject/exzdvxtx.html