一个JavaScript上的OOP编程技巧:继承
2010-05-20 05:32 Nana's Lich 阅读(1975) 评论(5) 编辑 收藏 举报其实这一次要说的东西是在很久以前就发现了的,在我知道博客园这个平台以前也在一个现在已经废弃了的blog上发了出来,但是来了博客园以后很长时间内我都苦于不知道怎么样写文章来讲解比较好……
今天正好睡不着,就索性地来次随性地发挥吧,反正每次都很正经地去说一件事情也是很累的……
在探索我马上要介绍的这种技巧之前,我也见过一些文章介绍如何在JavaScript中实现类的继承。但是,我总是觉得这些文章中好像是欠缺了点什么,带着这种缺憾的感觉我就开始了并不算太认真的JavaScript——老实说,我更希望大家能用“ECMAScript”来称呼它——探索旅程。
后来,我发现了一个技巧——其实这个技巧很早以前就被道大师开发出来,并且已经被用在了一些成熟的框架中了,但在我发现它的时候还很难找到文章去介绍它,大部分介绍JavaScript中的继承的文章都是用那种又难看又buggy的方法……
好吧,也许你已经不耐烦了:随性也用不着说这么多废话吧?
其实那些让我有缺憾感的地方,其中之一就是instanceof运算符的结果。
举个例子说,如果我们有这样的一个构造器:
1 2 | function A(){ } |
那么当我们进行这样的测试的时候:
1 | new A() instanceof A |
我们得到的结果会是true。
但是,如果我们编写一个构造器B,用以前的文章所讲解的这样那样的方法来继承自A,那么进行下面这样的测试得到的结果通常会是false:
1 | new B() instanceof A |
不过幸运的是,如果你看的是最近一年以内的文章,多半会介绍这样的一种方法:
1 2 3 4 5 6 | function A(){ } function B(){ } B.prototype = new A; B.prototype.constructor = B; |
经过这样的处理再进行new B instanceof A的测试,得到的结果就应该是true了。
可能你会问了:“哎!?那A的函数体里面要是有对对象的初始化操作呢?B的实例不就没有这些初始化了吗?”
嘿嘿嘿,其实只要再这样改一下就可以了:
1 2 3 | function B(){ A.apply( this , arguments); } |
怎么样?今天你new B了吗?
不过,到现在为止,new A和new B还是有一些缺憾,你能猜出来这次我说的缺憾是在哪吗?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器