继承Prototype实现语句不能写在动态原型法中的理解
阅读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实现语句不能写在动态原型法中的理解的更多相关文章
- js 输出语句document.write()及动态改变元素中内容innerHTML的使用
操作 HTML 元素 如需从 JavaScript 访问某个 HTML 元素,您可以使用 document.getElementById(id) 方法. 请使用 "id" 属性来标 ...
- 【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】
一.多继承 案例1:小孩继承自爸爸,妈妈.在程序入口模块再创建实例调用执行 #father模块 class Father(object): def __init__(self,money): self ...
- JS-Object(3) 继承(prototype方式, 类方式); javascript6的知识(部分)
原型方式的继承 创建child object classes(constructors) , 子类如何从父类中继承特性. 原型链继承prototypal inheritance (ruby中的继承也是 ...
- 代理模式精讲(手写JDK动态代理)
代理模式是一种架构型模式,表现出来就是一个类代表另一个类的功能,一般用在想对访问一个类的时候做一些控制,同时又不想影响正常的业务,这种代理模式在现实的生活中应用的也非常的广泛,我用穷举法给举几个好理解 ...
- 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 ...
- 读取数据表中第m条到第n条的数据,SQL语句怎么写?
原文:读取数据表中第m条到第n条的数据,SQL语句怎么写? 对于MySQL或者Oracle来说,如果实现从Table 表中取出第 m 条到第 n 条的记录操作,我们需要TOP函数(不是所有的数据库都支 ...
- SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比
原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比 今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章 ...
- 探讨SELECT语句的元数据&动态取样&读一致性导致的一致性读和递归操作
前几天,论坛上的同行在讨论SELECT语句的元数据,动态取样和读一致性导致的一致性读和递归问题,今天有时间,就试着进行了测试,本人测试环境如下: win7_64+Oracle11.2.0.4_64 那 ...
- dedecms清空所有文章怎么操作?sql语句如何写?
小C新建了一个站,确切的说是复制,出于seo考虑,决定清空所有文章,那么dedecms清空所有文章怎么操作?sql语句如何写呢?特别提醒:修改之前一定要先做好备份,以防万一!下面的语句在迫不得已的情况 ...
随机推荐
- gitlab & gerrit & git & repo & jenkins
Omnibus GitLab documentation(中文安装说明) 在自己的服务器上部署 GitLab 社区版->较为全面 GIT & REPO & GERRIT (三) ...
- Web 在线文件管理器学习笔记与总结(1)初始文件以及获取首层目录信息
在线文件管理器即使用浏览器管理和操作项目中的目录和文件 文件相关操作包括: 1.创建文件 2.判断文件的权限 3.文件的大小 4.文件的创建时间.修改时间.访问时间 5.查看文件的内容 6.修改文件的 ...
- PDO 学习与使用 ( 一 ) :PDO 对象、exec 方法、query 方法与防 SQL 注入
1.安装 PDO 数据库抽象层 PDO - PHP Data Object 扩展类库为 PHP 访问数据库定义了一个轻量级的.一致性的接口,它提供了一个数据访问抽象层,针对不同的数据库服务器使用特定的 ...
- PHP+jQuery 注册模块开发
/* ******* 环境: Apache2.2.8 + PHP5.2.6 + MySQL5.0.51b + jQuery-1.8.3.min.js ************** 其他组件:Zend_ ...
- UDP 构建p2p打洞过程的实现原理(持续更新)
UDP 构建p2p打洞过程的实现原理(持续更新) 发表于7个月前(2015-01-19 10:55) 阅读(433) | 评论(0) 8人收藏此文章, 我要收藏 赞0 8月22日珠海 OSC 源创 ...
- php 支持断点续传的文件下载类
php 支持断点续传的文件下载类 分类: php class2013-06-30 17:27 17748人阅读 评论(6) 收藏 举报 php断点续传下载http测试 php 支持断点续传,主要依靠H ...
- dynamic-link library shared library of functions and resources
https://msdn.microsoft.com/en-us/library/1ez7dh12.aspx A dynamic-link library (DLL) is an executable ...
- improve performance whilemaintaining the functionality of a simpler and more abstract model design of processor hardware
Computer Systems A Programmer's Perspective Second Edition In this chapter, we take a brief look at ...
- OpenGL完全教程 第一章 初始化OpenGL
第一章 初始化OpenGL 无论是什么东西,要使用它,就必须对它进行初始化.如果你之前使用过GDI,你应该也多多少少了解到GDI在绘制图形之前要为之创建渲染环境.OpenGL也一样.本章给出的代码,大 ...
- JVM内存配置
JVM内存主要分为两个部分,分别是PermanentSapce和HeapSpace. PermantSpace主要负责存放加载的Class类级对象如class本身,method,field等反射对象, ...