阅读javascript高级编程中, 对动态原型法中写Prototype继承父类对象的不可行的现象,不甚理解。

书上说是技术原因,如下有问题代码:

但是把protype语句移到构造函数后面,就OK,如下图:

  找到代码 https://raw.githubusercontent.com/nzakas/professional-javascript/master/edition1/ch04/DynamicPrototypePolygonExample.htm

通过实验确定有如下解释:

1、 Prototype就是一个对象,对象中的所有的属性和方法, 都是实例化的内容。

2、 构造函数在被new生成的时候,此实例的Prototype对应,new之前此类的Prototype。

3、 构造函数中,修改Prototype,不影响即将诞生的实例的Prototype按照之前的内容生成。

如果将Triangle Prototype赋值,放在构造函数中, 则第一次new动作的时候, 此类的Prototype对象是空对象 {},

没有任何属性和方法,则第一次new出的实例的Prototype为 {}, 没有 getArea 函数;

但是第一次执行之后, Prototype 切换为 new Polygon 对象, 且不再改变, getArea 函数也被重载, 在第二次及之后的new Triangle都是有 getArea 方法的。

测试代码:

<html>
<head>
<title>Example</title>
</head>
<body>
<script type="text/javascript"> function Polygon(iSides) {
this.sides = iSides;
console.log("con poly")
if (typeof Polygon._initialized == "undefined") { Polygon.prototype.getArea = function () {
return 0;
}; Polygon._initialized = true;
}
} function Triangle(iBase, iHeight) {
Polygon.call(this, 3);
this.base = iBase;
this.height = iHeight; if (typeof Triangle._initialized == "undefined") {
/* 只要有对 Prototype 指向对象的修改,
则继承和覆盖都不生效 */
//Triangle.prototype = new Polygon(); /* 如果仅仅是从Polygon实例中获取方法,
并赋值给Prototype,则是OK的 */
var pobj = new Polygon();
Triangle.prototype.getArea = pobj.getArea; Triangle.prototype.getArea = function () {
return 0.5 * this.base * this.height;
}; Triangle._initialized = true;
}
} function Rectangle(iLength, iWidth) {
Polygon.call(this, 4);
this.length = iLength;
this.width = iWidth; if (typeof Rectangle._initialized == "undefined") {
Rectangle.prototype.getArea = function () {
return this.length * this.width;
}; Rectangle._initialized = true;
}
}
/* retangle 非动态原型中实现继承 OK */
Rectangle.prototype = new Polygon(); /* 构造函数中Prototype对象没有改变,
在构造函数中有对getArea修改, 不影响实例化的对象有getArea */
var Polygon = new Polygon(12);
alert("Polygon.sides="+Polygon.sides)
alert("Polygon.getArea="+Polygon.getArea()) var triangle = new Triangle(12, 4);
/* 动态原型法中,只要有对 Prototype 指向对象的修改,
则继承和覆盖都不生效,对于第一次new不生效, 对于第二次生效 */
//var triangle1 = new Triangle(12, 4);
var rectangle = new Rectangle(22, 10); alert(triangle.sides);
alert(triangle.getArea());
//alert(triangle1.getArea()); alert(rectangle.sides);
alert(rectangle.getArea()); </script> </body>
</html>

继承Prototype实现语句不能写在动态原型法中的理解的更多相关文章

  1. js 输出语句document.write()及动态改变元素中内容innerHTML的使用

    操作 HTML 元素 如需从 JavaScript 访问某个 HTML 元素,您可以使用 document.getElementById(id) 方法. 请使用 "id" 属性来标 ...

  2. 【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】

    一.多继承 案例1:小孩继承自爸爸,妈妈.在程序入口模块再创建实例调用执行 #father模块 class Father(object): def __init__(self,money): self ...

  3. JS-Object(3) 继承(prototype方式, 类方式); javascript6的知识(部分)

    原型方式的继承 创建child object classes(constructors) , 子类如何从父类中继承特性. 原型链继承prototypal inheritance (ruby中的继承也是 ...

  4. 代理模式精讲(手写JDK动态代理)

    代理模式是一种架构型模式,表现出来就是一个类代表另一个类的功能,一般用在想对访问一个类的时候做一些控制,同时又不想影响正常的业务,这种代理模式在现实的生活中应用的也非常的广泛,我用穷举法给举几个好理解 ...

  5. Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)

    下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...

  6. 读取数据表中第m条到第n条的数据,SQL语句怎么写?

    原文:读取数据表中第m条到第n条的数据,SQL语句怎么写? 对于MySQL或者Oracle来说,如果实现从Table 表中取出第 m 条到第 n 条的记录操作,我们需要TOP函数(不是所有的数据库都支 ...

  7. SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比

    原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比 今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章 ...

  8. 探讨SELECT语句的元数据&amp;动态取样&amp;读一致性导致的一致性读和递归操作

    前几天,论坛上的同行在讨论SELECT语句的元数据,动态取样和读一致性导致的一致性读和递归问题,今天有时间,就试着进行了测试,本人测试环境如下: win7_64+Oracle11.2.0.4_64 那 ...

  9. dedecms清空所有文章怎么操作?sql语句如何写?

    小C新建了一个站,确切的说是复制,出于seo考虑,决定清空所有文章,那么dedecms清空所有文章怎么操作?sql语句如何写呢?特别提醒:修改之前一定要先做好备份,以防万一!下面的语句在迫不得已的情况 ...

随机推荐

  1. p4-hlir/test源码 stateful.p4 control_flow_opt.p4

    stateful.p4 #include "includes/headers.p4" #include "includes/parser.p4" action ...

  2. RT-Thread 线程调度

    /* 变量分配4字节对齐 */ ALIGN(RT_ALIGN_SIZE) /* 静态线程的 线程堆栈*/ ]; ]; /* 静态线程的 线程控制块 */ static struct rt_thread ...

  3. PHP文件操作 之打开远程文件

    //配置php.ini 开启allow_url_fopen选项 //访问的文件有可读或者可写的权限 //$f = fopen('http://www.example.com/a.txt','rb'); ...

  4. pointer

    https://en.wikipedia.org/wiki/Pointer_(computer_programming) In computer science, a pointer is a pro ...

  5. 关于jQuery学习

    ≡[..]≡≡[..]≡ 所有的实例都位于document.ready里面--为了防止文档在未完全加载之前就运行函数导致操作失败. $(document).ready(function(){ --- ...

  6. Delphi的哈希表(一)

    哈希表是通过哈希值来访问的,通过一定的内存浪费获取检索速度,在检索项时是不需要逐一检索.在编程中有一定的好处. unit Unit1; interface uses Windows, Messages ...

  7. VC更换图标文件

    步骤 1. 删除图标 2. 在VC中移除图标 3. 用新图标替换原来图标 4. 添加图标到VC 5. 重新编译 参考文档 http://www.cnblogs.com/BloodAndBone/arc ...

  8. 蓝牙BLE ATT剖析(二)-- PDU

    一.Error Handling Error Response The Error Responseis used to state that a given request cannot be pe ...

  9. docker sonaqube

    postgresql:   image: orchardup/postgresql:latest   environment:   - POSTGRESQL_USER=sonar   - POSTGR ...

  10. php读取qqwry.dat ip地址定位文件的类

    <?php// +----------------------------------------------------------------------// |// +---------- ...