在JavaScript中继承不像C#那么直接,C#中子类继承父类之后马上获得了父类的属性和方法,但JavaScript需要分步进行。

让Brid 继承 Animal,并扩展自己fly的方法。

    function Animal(name) {
this.name = name;
this.type = "animal";
}
Animal.prototype= {
say:function() {
alert("I'm a " + this.type + ",my name is " + this.name);
}
} function Bird(name) {
Animal.call(this, name);
}
//这里继承了父类的行为 say
Bird.prototype = Animal.prototype;
//再扩展自己的方法
Bird.prototype.fly=function() {
alert("I'm flying");
}
var mybird = new Bird("xiao cui");
  mybird.say();//I'm a animal,my name is xiao cui
mybird.fly();
//结果狗也能飞起来了.....
var mydog = new Animal("cai cai ");
mydog.fly();

造成这种现象,是因为JavaScript中传值和传址的区别。如果是数值型、布尔型、字符型等基本类型进行赋值的时候会讲数据复制一份,即传值。而如果是数组、hash对象等复杂类型、赋值的时候是直接用到内存地址。也就是传址。这和C#引用类型和值类型的赋值道理一样,只是JavaScript和C#各自包含的类型不一样。

            var a = 10;
var b = a;
b++;
var c = [1, 2, 3];
var d = c;
d.push(4);
alert(a);//
alert(b);//
alert(c);//1,2,3,4
alert(d);//1,2,3,4

所以数组如果不想受到上面的影响 需要用slice和concat方法。要不就循环赋值。

           var a = [1, 2, 3];
var b = a.slice();
var c = a.concat();
b.pop();
c.push(4);
alert(a);//1,2,3;
alert(b);//1,2
alert(c);//1,2,3,4

回到Bird的问题,property本质上也是个hash对象,直接赋值就是传址,所以造成了Dog也fly的笑话。然后做一下改动:

 function Animal(name) {
this.name = name;
this.type = "animal";
}
Animal.prototype= {
say:function() {
alert("I'm a " + this.type + ",my name is " + this.name);
}
}
function Bird(name) {
//这里只继承属性的。
Animal.call(this, name);
}
//这里继承了父类的行为 say
Bird.prototype = new Animal();
Bird.prototype.constructor = Bird;
//再扩展自己的方法
Bird.prototype.fly=function() {
alert("I'm flying");
}
var mybird = new Bird("xiao cui");
mybird.say();//I'm a animal,my name is xiao cui
mybird.fly(); var dog = new Animal("xiao huang");
dog.fly();//报错了

使用new someFunction实现传值,而后因为Bird.property=new Animal();将Bird.property.constructor指向了Animal,所以用Bird.property.constructor=Bird 纠正回来。

这个时候调用dog.fly 就报错了:

JavaScript继承的话题各路大神都讨论比较多了,写一写,自己梳理下。 更多的了解可以看阮一峰的博客

学习书籍:web前端开发修炼之道

下载链接不是我个人的,公司连百度云都屏蔽了,回去再换百度云的,这本书基于作者的自己的一些经验总结,名字有些浮夸。经验丰富的开发者都可以快速的阅读的一本书。

【读书笔记】javascript 继承的更多相关文章

  1. JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)

    JavaScript继承的6种方法 1,原型链继承 2,借用构造函数继承 3,组合继承(原型+借用构造) 4,原型式继承 5,寄生式继承 6,寄生组合式继承 1.原型链继承. <script t ...

  2. 《JavaScript权威指南》读书笔记——JavaScript核心

    前言 这本由David Flanagan著作,并由淘宝前端团队译的<JavaScript权威指南>,也就是我们俗称的“犀牛书”,算是JS界公认的“圣经”了.本书较厚(有1004页),读起来 ...

  3. <读书笔记>Javascript系列之6种继承(面向对象)

    写在前面: 以下三选一: 阅读博文JavaScript 对象详解. 阅读<JavaScript权威指南>第6章. 阅读<JavaScript高级程序设计>第6章. 注意:只需要 ...

  4. 《Javascript高级程序设计》读书笔记之继承

    1.原型链继承 让构造函数的原型对象等于另一个类型的实例,利用原型让一个引用类型继承另一个引用类型的属性和方法 function SuperType() { this.property=true; } ...

  5. 读书笔记-JavaScript面向对象编程(一)

    PDF下载链接: http://pan.baidu.com/s/1eSDSTVW 密码: 75jr 第1章 引言 1.1 回顾历史 1.2 变革之风 1.3 分析现状 1.4 展望未来 1.5 面向对 ...

  6. JavaScript语言精粹读书笔记 - JavaScript函数

    JavaScript是披着C族语言外衣的LISP,除了词法上与C族语言相似以外,其他几乎没有相似之处. JavaScript 函数: 函数包含一组语句,他们是JavaScript的基础模块单元,用于代 ...

  7. [读书笔记]javascript语言精粹'

    人比较笨,以前只做项目,案例,然而一些javascript的很多理论不知道该怎么描述,所以最近开启一波读书之旅: 标识符 1.定义 标识符以字母开头,可能后面跟上一个或多个字母.数字或者下划线. 2. ...

  8. 读书笔记-JavaScript面向对象编程(三)

    第7章 浏览器环境 7.1 在HTML页面中引入JavaScript代码 7.2概述BOM与DOM(页面以外事物对象和当前页面对象) 7.3 BOM 7.3.1 window对象再探(所以JavaSc ...

  9. 读书笔记-JavaScript高级程序设计(1)

    1.组合继承 (JavaScript 中最常用的继承模式 ) (position: page168) (书中定义了两个变量名 SuperType   SubType  乍一看 感觉不太能区分,我将改为 ...

  10. JavaScript语言精粹读书笔记- JavaScript对象

    JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. JavaScript中的对象是可变的键控集合(keyed collecti ...

随机推荐

  1. Apizza可以进行本地调试,也可以进行跨域调试,但是需要chrome插件

    装Apizza Chrome插件   1 1. 进入Apizza官方网站.注册账号,进入控制台,可以看到提示安装chrome插件 2. 进入google app商店,搜索apiano 找到对于插件安装 ...

  2. sql报句柄无效。 (异常来自 HRESULT:0x80070006 (E_HANDLE))

    是由于数据库连接资源被耗尽或者用完没被释放导致的. 我在字符串中加了启用连接池好了. 如果错误信息为:sql 无效操作.连接被关闭 也是这个问题导致的.

  3. GIL与线程互斥锁

    GIL 是解释器级别的锁,是限制只有一个原生线程运行,防止多个原生线程之间修改底层的共享数据.而线程互斥锁是防止多个线程同时修改python内存空间的共享数据.

  4. WebView加载HTML图片大小自适应与文章自动换行

    http://www.brighttj.com/ios/ios-webview-load-html-image-adaptive.html 在很多App中都会使用到webview,尤其是在加载新闻内容 ...

  5. FreeBSD_11-系统管理——{Part_9 - SubVersion}

    一.使用 svn / svnlite 代替 freebsd-update 及 portsnap 等常规工具更新系统及 ports 源码 二.安装可信 ca 机构列表 cd /usr/ports/sec ...

  6. Windows系统下部署安装一个/多个Tomcat8

    首先从http://tomcat.apache.org/上下载Tomcat8.0压缩版的,解压到指定路径后即可.  第一:在Windows系统中安装部署单个Tomcat         对于这种情况, ...

  7. XML解析、使用TreeView呈现效果

    首先用到TXMLDocument控件: Memo来显示XML文件, TreeView来呈现元素: 源代码: Procedure TForm2.Button1Click(Sender: TObject) ...

  8. ubuntu 终端设置(颜色与长路径)

    Linux给人最大的享受就是可以根据个人喜好去定制令自己舒服的系统配置,像终端颜色的设置就是一个典型的例子. 图1 系统默认状态下的终端显示     在没有经过自定义配置的终端下工作久了,难免容易疲劳 ...

  9. 移动端H5页面的最佳终端适配之Flexible

    lib-flexible是什么? lib-flexible是一个制作H5适配的开源库,可以点击这里下载相关文件,获取需要的JavaScript和CSS文件. 当然你可以直接使用阿里CDN: <s ...

  10. shell编写mysql备份工具

    如需转载,请经本人同意. 这是之前写的一个备份脚本,调用的备份工具是xtrabackup 编写思路是:每周一全备份,备份后提取lSN号,对备份文件进行压缩,其余时候在LSN的基础上进行增量备份,并对3 ...