【JavaScript学习】面向对象的程序设计(3):原型链继承
2017-09-28 16:28
816 查看
ECMAScript只支持实现继承(继承实际的方法),主要依靠原型链来实现。
实现的本质是重写原型对象,代之以一个新类型的实例。
即,原来存在于SuperType的实例中的所有属性和方法,现在也存在与SubType.prototype中了。
确定了继承关系之后,给SubType.prototype添加了一个方法,这样就在继承了SuperType的属性和方法的基础上又添加了一个新方法。
子类型有时要覆盖超类型中的某个方法,或者需要添加超类型中不存在的某个方法。
——给原型添加方法的代码一定要放在替换原型的语句之后。
通过原型链实现继承时,不能使用对象字面量创建原型方法,因为这样做会重写原型链。
缺点:
1、包含引用类型值的原型的继承会出问题。
2、创建子类型的实例时,没有办法在不影响所有对象实例的情况下,给超类的构造函数传递参数。
原型链
基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。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学习】面向对象的程序设计(6):原型式继承
- JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承
- 【JavaScript学习】面向对象的程序设计(5):组合继承(伪经典继承)
- 【JavaScript学习】面向对象的程序设计(7):寄生式继承和寄生组合式继承
- 面向对象与C++程序设计-类的继承与派生学习笔记
- 关于JavaScript的面向对象和继承有利新手学习
- JavaScript 面向对象程序设计(下)——继承与多态
- JavaScript 面向对象程序设计(下)--继承与多态
- JavaScript基础学习笔记(四) ---面向对象的程序设计
- javascript高级程序设计第六章:面向对象的程序设计——继承读书笔记
- 菜鸟的学习之路(3) —java 面向对象程序设计的封装、继承和多态
- 【JavaScript】面向对象程序设计-继承与多态
- JavaScript学习笔记(七)----面向对象的程序设计
- JavaScript之面向对象学习八(继承)
- JavaScript 面向对象程序设计(下)——继承与多态
- 关于JavaScript的面向对象和继承有利新手学习
- JavaScript高级程序设计学习笔记--面向对象程序设计
- JavaScript面向对象程序设计——继承
- JavaScript 面向对象程序设计(下)——继承与多态(转)
- javascript复习笔记六----面向对象程序设计(继承)