原型链是采用最主要的继承方式,
原理:每一个类(构造器,js中的function)都有一个原型属性(prototype)指向一个原型对象,原型对象有一个构造器(constructor),它又指回到function,是个循环引用,类的每个实例也有一个原型属性(代码无法访问,叫做_proto_),它跟构造器原型指向的是同一个对象,即同一个类的所有实例公用一个原型对象,要实现两个类型的继承,就是将一个类型的原型指向另一个类型的实例,而不再指定原来的默认的原型对象,这样就形成了原型链

子类可以通过原型链获得超类的所有属性和方法,从而实现了继承

实例:
function baseClass() { this.baseName = 'baseClass'; }
baseClass.prototype.getbaseClassName = function () { return this.baseName };

function childClass() { this.childName = 'childClass'; }

childClass.prototype = new baseClass();

childClass.prototype.getchildClassName = function () { this.childName; }
var instanse = new childClass();
instanse.getbaseClassName();

childClass(及它的实例)的prototype(_proto_)属性不在指向默认的prototype对象,而是Baseclass的实例,这个实例也有个属性(_proto_),它指向的是BaseClass的原型对象,在childClass的实例instanse上查找baseName属性的过程是这样:

首先在instanse自身找,但没找到,然后进入它的原型对象(_proto_属性,此时是BaseClass的实例,不再是默认的原型对象)依然没找到,则进入这个baseclass实例的原型对象(_proto_属性,默认的原型对象上找),终于找到,则返回这个方法的执行结果,

类的原型对象是所有实例共享的,这就造成一个问题,原型对象(父类实例)的属性和方法的改变将影响到所有实例,无论是创建的还是即将创建的

function baseClass() { this.Colors = ['bule', 'red']; }
function childClass() { }
childClass.prototype = new baseClass();
var instanse1 = new childClass();
var instanse2 = new childClass();
//在此实例上对从父类继承过来的属性进行修改
instanse2.Colors.push('green');
var instanse3 = new childClass();
///查看各个实例的colors属性值
alert(instanse1.colors);//red,blue,green
alert(instanse2.colors);//red,blue,green
alert(instanse3.colors);//red,blue,green
可见对于任一个实例来讲,如果修改了继承的属性值,则将影响任何时候创建的实例
另外如果继承的层次过多,则调用最顶层的效率最低

javascript类继承系列二(原型链)的更多相关文章

  1. javascript类继承系列四(组合继承)

    原理: 结合了原型链和对象伪装各自优点的方式,基本思路是:使用原型链继承原型上的属性和方法,使用对象伪装继承实例属性,通过定义原型方法,允许函数复用,并运行每个实例拥有自己的属性 function B ...

  2. javascript类继承系列五(其他方式继承)

    除了前面学习的三种继承外,还有另外三种:原型继承寄生继承,寄生组合继承都是以: function object(o) { function F() { } F.prototype = o; retur ...

  3. javascript类继承系列三(对象伪装)

    原理:在子类的构造器上调用超类构造器(父类构造器中的this指向子类实例),js提供了apply()和call()函数,可以实现这种调用 function baseClass() { this.col ...

  4. javascript类继承系列一

    js中没有提供类(class,抽象类,接口等高级的抽象),可以用new,但new的function的对象,构造器 但在js中可以通过function来模拟类的一些特性function fun_name ...

  5. JavaScript系列--浅析原型链与继承

    一.前言 继承是面向对象(OOP)语言中的一个最为人津津乐道的概念.许多面对对象(OOP)语言都支持两种继承方式::接口继承 和 实现继承 . 接口继承只继承方法签名,而实现继承则继承实际的方法.由于 ...

  6. 【前端知识体系-JS相关】深入理解JavaScript原型(继承)和原型链

    1. Javascript继承 1.1 原型链继承 function Parent() { this.name = 'zhangsan'; this.children = ['A', 'B', 'C' ...

  7. JavaScript类继承, 用什么方法好

    JavaScript类继承, 用什么方法好 一个实例: 基类Car: function Car(color, year) { this.name = "car"; this.col ...

  8. 《JAVASCRIPT高级程序设计》根植于原型链的继承

    继承是面向对象的语言中,一个最为津津乐道并乐此不疲的话题之一.JAVASCRIPT中的继承,主要是依靠原型链来实现的.上一篇文章介绍过,JAVASCRIPT中,每一个对象都有一个prototype属性 ...

  9. JavaScript高级内容笔记:原型链、继承、执行上下文、作用域链、闭包

    最近在系统的学习JS深层次内容,并稍微整理了一下,作为备忘和后期复习,这里分享给大家,希望对大家有所帮助.如有错误请留言指正,tks. 了解这些问题,我先一步步来看,先从稍微浅显内容说起,然后引出这些 ...

随机推荐

  1. pcDuino汉化方法

    1,打开终端:2,在终端输入命令 sudo apt-get update 更新一下软件源3, 输入命令下载中文支持包 sudo apt-get install language-pack-gnome- ...

  2. 远程ubuntu虚拟机Tensorflow搭建 - 1 SSH连接

    感谢英才计划,我们每个人收获了一台清华的虚拟机. 4 core CPU 16GB Memory 80GB Disk 配置不错了... 用ssh密钥登录.赠送hadoop-key.pem一把. 先用su ...

  3. 你所不知道的C++

    C++与C的不同 C++从诞生之初就号称和C是兼容的,正是这种兼容,使C++得以迅猛发展,然而也正是这种兼容,让C++背上了沉重的历史包袱.且不论其利弊,让我们来看看C++在兼容C的那部分中,与C语言 ...

  4. Total Commander快捷键

    (1)tab键---切换左.右两个大的窗口:

  5. git 和 github 使用笔记

    想干这么一件事:写一个web自动化测试的项目,部署在公司内网的小服务器上. 我想拐个弯干这件事:公司有一个工作用的windows电脑,还有一个linux Ubuntu11.04的小测试服务器.我在本地 ...

  6. Qt学习之路(2)------Qt中的字符串类

    QString QString的一些基本用法 basic.cpp #include <QTextStream> int main(void) { QTextStream out(stdou ...

  7. 【转】开始使用Mac OS X——写给Mac新人

    写这篇文档的原因有两个,一.身边使用Mac的朋友越来越多,经常会有人来咨询一些常见的使用问题,比如:“为什么把界面右上角的红色按钮叉掉,程序还没有关闭?”之类.而且我也不愿意看到很多人使用OSX时仅仅 ...

  8. javascript如何监听页面刷新和页面关闭事件

    本文转之http://www.qqtimezone.top 在我们的日常生活中,时常遇到这么一种情况,当我们在点击一个链接.关闭页面.表单提交时等情况,会提示我们是否确认该操作等信息. 这里就给大家讲 ...

  9. SecureCRT 无法删除字符

    1. 2.

  10. try与finally返回结果执行先后详解

    先看一段代码: @Test public void test1(){ System.out.println(testf1()); } int testf1() { int x = 1; try { r ...