js高级教程 第六章-面对对象的程序设计(四)

本文介绍了JavaScript中通过原型链实现继承的基本原理与方法。探讨了如何利用构造函数、原型对象及其实例之间的链接来实现继承,并展示了如何通过借用构造函数等方式在子类中调用并扩展父类的功能。
  • 原型链
    1.作用:实现继承的主要方法
    2.基本思想:利用原型,让一个引用类型继承另一个引用类型。
    3.概念:A构造函数都有一个A原型对象,A原型对象都包含一个指向构造函数的指针。而A实例有一个指向A原型对象的指针。如果A原型对象同时又是B类型的一个实例,那么A原型对象(B类型的一个实例)就有一个指向B类型的实例,依次类推,构成的原型与实例的链条就是原型链。
function SuperType(){
   this.prototype = true;
}

SuperType.prototype.getSuperType = function(){
  return this.prototype;
}

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

// SubType的原型作为SuperType的实例来继承SuperType的方法
SubType.prototype = new SuperType();

// instance作为SubType的一个实例
var instance = new SubType();
alert(instance.getSuperType());

PS:现在的SubType的constructor指向的是SuperType

原型搜索机制:前面的章节又提到过原型的搜索机制,在以读取模式访问实例属性的时候,会按照实例-原型的顺序搜索。而使用原型链继承的情况是:实例-本身的原型-父类的原型(如果还有祖父类,曾祖父类则继续向上)

另一个层次的继承:上面的继承其实还包含一个默认的继承,那就是对于Object的继承,因此才会继承toString,valueOf这样的方法。这个继承的模型是这样的。

Created with Raphaël 2.1.0继承关系SubTypeSuperTypeObject
  • 判断实例和原型的关系
    1.使用instanceof
function SuperType(){
   this.prototype = true;
}

SuperType.prototype.getSuperType = function(){
  return this.prototype;
}

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

// SubType的原型作为SuperType的实例来继承SuperType的方法
SubType.prototype = new SuperType();

// instance作为SubType的一个实例
var instance = new SubType();
alert(instance instanceof SubType);//true
alert(instance instanceof SuperType);//true
alert(instance instanceof Object);//true

2.使用isPrototypeOf

alert(SubType.prototype.isPrototypeOf(instance));//true
alert(SuperType.prototype.isPrototypeOf(instance));//true
alert(Object.prototype.isPrototypeOf(instance));//true
  • 关于在子类型中定义方法的问题
    原型添加的方法要在替换原型的语句后面
function SuperType(){
   this.prototype = true;
}

SuperType.prototype.getSuperType = function(){
  return this.prototype;
}

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

// SubType的原型作为SuperType的实例来继承SuperType的方法
SubType.prototype = new SuperType();
// 一个添加的SubType方法
SubType.prototype.getSubType = function(){
  return 1;
}
// 重写的SuperType的方法,但是在SuperType本身中并没有改变
SubType.prototype.getSuperType = function(){
  return false;
}

// instance作为SubType的一个实例
var instance = new SubType();
alert(instance.getSuperType());//false
  • 借用构造函数
    1.基本思想:在子类型构造函数的内部调用超类型的构造函数。
    2.方法:call或者apply实现
function superType(){
  this.color = ['red','black'];
}

function subType(){
  superType.call(this);
}

var instance1 = new subType();
instance1.color.push('blue');
alert(instance1.color);//red black blue

var instance2 = new subType();
alert(instance2.color);//red black

虽然所有的实例拥有了超类型的superType,但是每个实例修改超类型产生的都是副本,不会对superType的color产生影响。

3.传递参数
借用构造函数的好处是可以向超类型传递参数。

function superType(name){
  this.name = name;
}

function subType(){
  superType.call(this,"halo");
  this.age = 11;
}

var instance = new subType();
alert(instance.name);//halo
alert(instance.age);//11

转载于:https://www.cnblogs.com/comefuture/p/8305948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值