//ECMAScript中的原型继承
//ECMAScript中的继承主要是依靠原型链实现的。(关于原型链的介绍,详见《高三》6.3.1章节 P162)

//本文示例主要为了说明SubType.prototype=new SuperType()与SubType.prototype=SuperType.prototype的区别。
//从理解的角度来说,它们的区别貌似就是把SubType.prototype原型指向了父类的实例对象与指向父类原型对象的区别,这似乎不难得出结论,
//但是作为一个有原则有严谨态度的人,我觉得就还是有必要用实际行动来证明下想法的正确与否:

//定义父类型,并在类型内部定义了一个实例属性superProperty:
function SuperType() {
    this.superProperty = "super property";
}

//定义原型方法
SuperType.prototype.getSuperValue = function () {
    return this.superProperty;
};

//定义子类型,并在子类型内部定义了实例属性
function SubType() {
    this.subProperty = "sub property";
}

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

//定义子类型的原型方法
SubType.prototype.getSubValue = function () {
    return this.subProperty;
};

var instance = new SubType();
document.write(instance.superProperty + "<br/>"); //super property
document.write(instance.subProperty + "<br/>"); //sub property
document.write(instance.getSuperValue() + "<br/>"); //super property
document.write(instance.getSubValue() + "<br/>"); //sub property
//以上结果证明,SubType.prototype = new SuperType()会继承父类的所有可见成员,不管是实例成员还是原型成员。
document.write(instance.constructor + "<br/>");
//但要注意的是,SubType.prototype = new SuperType()实际上是重写了SubType的原型,所以SubType.prototype原型对象的constructor属性也变为了SuperType,
//即:instance.constructor==SuperType
//因此,继承后判断对象类型时要特别注意。

//如果采用SubType.prototype = SuperType.prototype继承方式,会是什么结果呢?
document.write(instance.superProperty + "<br/>"); //undefined
document.write(instance.subProperty + "<br/>"); //sub property
document.write(instance.getSuperValue() + "<br/>"); //undefined
document.write(instance.getSubValue() + "<br/>"); //sub property
//结论:采用这种纯原型继承的方式只继承了父类原型上的成员,如上所示,父类定义的实例属性superProperty值为undefined,
//说明实例instance中不存在这个属性,但是包含父类的原型方法getSuperValue()。
//与上面相同的是,instance.constructor还是SuperType,因为这样也相当于是重写了SubType.prototype原型对象。

ECMAScript中的原型继承的更多相关文章

  1. JS中的原型继承机制

    转载 http://blog.csdn.net/niuyongjie/article/details/4810835 在学习JS的面向对象过程中,一直对constructor与prototype感到很 ...

  2. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  3. javascript中的原型继承

    在Javascript面向对象编程中,原型继承不仅是一个重点也是一个不容易掌握的点.在本文中,我们将对Javascript中的原型继承进行一些探索. 基本形式 我们先来看下面一段代码: <cod ...

  4. JS中的原型继承和多重继承

    概念:1原型继承是创建新类型对象----子类型,子类型基于父类型,子类型拥有父类型所有的属性和方法(从父类型继承得到),然后修改其中的部分内容或者添加新的内容.继承最好在子类型模型可以被视为父类型对象 ...

  5. javascript 中的原型继承

    javascript圆形变成的基本规则: 所有数据都是对象: 要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它: 对象会记住它的原型: 如果对象无法响应某个请求,它会把这个请求委托给 ...

  6. JavaScript中的原型继承原理

    在JavaScript当中,对象A如果要继承对象B的属性和方法,那么只要将对象B放到对象A的原型链上即可.而某个对象的原型链,就是由该对象开始,通过__proto__属性连接起来的一串对象.__pro ...

  7. Javascript中的原型继承具体解释

    js中的继承,是面向对象的知识,由于js没有类的概念.所以继承是通过对象实现的.谈到继承.就必须说到prototype,就不得不先说下new的过程. 一个小小的列子: <script type= ...

  8. js中的原型继承

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统

    面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统 原型模式和基于原型继承的JavaScript对象系统 在 Brendan Eich 为 JavaScrip ...

随机推荐

  1. route按需加载的3种方式:vue异步组件、es提案的import()、webpack的require.ensure()

    1. vue异步组件技术 vue-router配置路由,使用vue的异步组件技术,可以实现按需加载. 但是,这种情况下一个组件生成一个js文件.举例如下: { path: '/promisedemo' ...

  2. osgViewer应用基础

    #ifdef _WIN32#include <windows.h>#endif#include <osgViewer/Viewer>#include <osgDB/Rea ...

  3. 仙剑奇侠传1系列:2.编译主程序SDLPAL及SDL

    上一篇:仙剑奇侠传1系列:1.本地运行环境及兼容性设置 介绍 仙剑奇侠传1是dos时代的经典游戏,相信以下图片能勾起大家的很多回忆.   sdlpal是仙剑奇侠传1的主程序.github项目sdlpa ...

  4. centos7 vim环境优化

    centos7默认是使用vi,而不是使用vim,所以,我们需要修改一下vi的别名,并且,我们使用neovim,vi毕竟还是有很多功能比较原始 所以 yum install neovim -ycat & ...

  5. 双目结构光三维扫描仪获得的三维点云模型(GIF)

  6. python 实现对象去重

    利用set()方法实现对象去重,重写__hash__方法和__eq__方法告诉程序什么样的对象是同一个对象 # 写一个类 拥有100个对象 # 拥有三个属性 name age sex # 如果两个对象 ...

  7. skywalking 的安装部署及其远程应用

    环境配置 centos 7.6 jdk 1.8 elasticsearch5.6.8 skyWalking3.2.6 1.安装elasticsearch wget https://artifacts. ...

  8. tensorflow搭建神经网络

    最简单的神经网络 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt date = np.linspa ...

  9. eNSP——利用单臂路由实现VLAN间路由

    原理: 以太网中,通常会使用VLAN技术隔离二层广播域来减少广播的影响,并增强网络的安全性和可管理性.其缺点是同时也严格地隔离了不同VLAN之间的任何二层流量,使分属于不同VLAN的用户不能直接互相通 ...

  10. *#【Python】【基础知识】【运算符】【Python的几类运算符】

    Python的运算符分为以下几类: 算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符 以及需要考虑的:运算符优先级 一.算术运算符: 需要注意的,上图是Python 2.0 ...