Javascript设计模式 - 笔记3

javascript 里面的继承是个非常复杂的话题,一言蔽之,就是你要替解释器干点活。另外,javascript属于使用原型式继承的语言,这个比较少见,所以直觉上不好拐弯。

先回顾比较简单的办法

类式继承

一个简单的类

1 2 3 4 5 6 7 8 9 10 11

/* class Person */ function Person(name) { this.name = name; } Person.prototype.getName = functino() { return this.name; } var reader = new Person('memoryboxes'); reader.getName();

好,下面定义一个它的子类

1 2 3 4 5 6 7 8

/* Class Author */ function Author(name, books) { Person.call(this, name); this.books = books; } Author.prototype = new Persion(); //set up the prototype chain Author.prototype.contructor = Author; //set the constructor attribute to author Author.getBooks = function() {return this.books;}

容易费解的是这两行:

1 2

Author.prototype = new Persion(); //set up the prototype chain Author.prototype.contructor = Author; //set the constructor attribute to author

javascript中,每个对象都有一个原型对象,在创建一个对象时,javascript会自动将其原型对象设置为其构造函数的prototype属性所指的对象。 在访问对象的某个成员时,如果这个成员未见于当前对象,那么javascript会沿着原型链向上逐一访问每个原型对象(最顶端为Object.prototype对象),直到找到这个成员为止。 这意味着,为了让一个类继承另一个类,只需将子类的prototype设置为基类的一个实例即可。

第二行将prototype的constructor属性重新设置为Author。是因为: 定义一个构造函数时,其默认的prototype对象是一个Object类型的实例,其contructor属性会被设置为构造函数本身。如果手工将prototype设置为另一个对象,就要重新设置其constructor属性。

最后,为了简化类的声明,可以将这些工作封装在extend函数中:

1 2 3 4 5 6

function extend(subClass, superClass) { var F = function(){}; F.prototype = superClass.prototype; subClass.prototype = new F(); subClass.prototype.contructor = subClass; }

作为改进,定义了一个新对象F,避免基类对象过大,创建实例浪费资源。

但是这样还有个小缺点,声明 Author的时候,还要显式的调用一下Person.call(),下面这个版本进一步做了改进:

1 2 3 4 5 6 7 8 9 10 11

function extend(subClass, superClass) { var F = function(){}; F.prototype = superClass.prototype; subClass.prototype = new F(); subClass.prototype.contructor = subClass; subClass.superclass = superClass.prototype; if(superClass.prototype.contructor == Object.prototype.constructor) { superClass.prototype.contructor = superClass; } }

增加了一个superclass属性来直接访问基类,这样声明Author的时候可以这么写:

1 2 3 4 5 6 7

/* Class Author */ function Author(name, books) { Author.superclass.contructor.call(this, name); this.books = books; } extend(Author, Person); Author.getBooks = function() {return this.books;}

原型式继承

TODO

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的知识天地

python超详细的基础笔记,你还在苦恼怎么学吗?

python是一种面向对象的解释型计算机程序设计语言,python的是吉多·范罗苏姆(Guido van Rossum)于1989年发明

12530
来自专栏大前端_Web

详解javascript作用域和闭包

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/deta...

12940
来自专栏Java帮帮-微信公众号-技术文章全总结

【选择题】Java基础测试三(15道)

【选择题】Java基础测试三(15道) 26.关于以下程序代码的说明正确的是( D ) 1.class HasStatic{ 2. privat...

42470
来自专栏极客编程

ECMAScript 6教程 (三) Class和Module(类和模块)

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文连接,博客地址为 http://www.cnblogs.co...

10530
来自专栏前端布道

JavaScript之Promise对象

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,...

12230
来自专栏飞雪无情的博客

Go语言实战笔记(八)| Go 函数方法

在Go语言中,函数和方法不太一样,有明确的概念区分。其他语言中,比如Java,一般来说,函数就是方法,方法就是函数,但是在Go语言中,函数是指不属于任何结构体、...

9110
来自专栏hrscy

Swift2.1-下标脚本下标脚本

类,结构体和枚举可以定义下标脚本,下标脚本可以认为是访问集合(collection),列表或序列的成员元素。你可是使用下标脚本来设置或通过索引检索值,而不需要调...

8830
来自专栏静晴轩

JavaScript字符串间的比较

字符串在JavaScript中几乎无处不在,在你处理用户的输入数据的时候,在读取或设置DOM对象的属性时,在操作cookie时,当然还有更 多…。@雪斌在Jav...

84290
来自专栏iOS开发攻城狮的集散地

run timeimport : 成员变量、类、方法

19290
来自专栏Python小屋

详解Python序列解包

序列解包(Sequence Unpacking)是Python中非常重要和常用的一个功能,可以使用非常简洁的形式完成复杂的功能,大幅度提高了代码的可读性,减少了...

41370

扫码关注云+社区

领取腾讯云代金券