位置: 编程技术 - 正文

再谈javascript面向对象编程(javascript面向)

编辑:rootadmin
另外这篇文章是一篇入门文章,我也是才开始学习Javascript,有一点心得,才想写一篇这样文章,文章中难免有错误的地方,还请各位不吝吐槽指正 吐槽Javascript 初次接触Javascript,这门语言的确会让很多正规军感到诸多的不适,这种不适来自于Javascript的语法的简练和不严谨,这种不适也来自Javascript这个悲催的名称,我在想网景公司的Javascript设计者在给他起名称那天一定是脑壳进水了,让Javascript这么多年来受了这么多不白之冤,人们都认为他是Java的附属物,一个WEB玩具语言。因此才会有些人会对Javascript不屑,认为Javascript不是一门真正的语言,但是这此他们真的错了。Javascript不仅是一门语言,是一门真真正正的语言,而且他还是一门里程碑式的语言,他独创多种新的编程模式原型继承,闭包(作者注:闭包不是JS首创,应该Scheme首创,prototypal inheritance 和 dynamic objects 是self语言首创,Javascript的首创并不精彩,谢谢网友的指正。),对后来的动态语言产生了巨大的影响。做为当今最流行的语言(没有之一),看看git上提交的最多的语言类型就能明白。随着HTML5的登场,浏览器将在个人电脑上将大显身手,完全有替换OS的趋势的时候,Javascript做为浏览器上的一门唯一真真的语言,如同C之于 unix/linux,java之于JVM,Cobol之于MainFrame,我们也需要来重新的认真地认识和审视这门语言。另外Javascript的正式名称是:ECMAScript,这个名字明显比Javascript帅太多了! 言归正传,我们切入主题——Javascript的面向对象编程。要谈Javascript的面向对象编程,我们第一步要做的事情就是忘记我们所学的面向对象编程。传统C++或Java的面向对象思维来学习Javascript的面向对象会给你带来不少困惑,让我们先忘记我们所学的,从新开始学习这门特殊的面向对象编程。既然是OO编程,要如何来理解OO编程呢,记得以前学C++,学了很久都不入门,后来有幸读了《Inside The C++ Object Model》这本大作,顿时豁然开朗,因此本文也将以对象模型的方式来探讨的Javascript的OO编程。因为Javascript 对象模型的特殊性,所以使得Javascript的继承和传统的继承非常不一样,同时也因为Javascript里面没有类,这意味着Javascript里面没有extends,implements。那么Javascript到底是如何来实现OO编程的呢?好吧,让我们开始吧,一起在Javascript的OO世界里来一次漫游 首先,我们需要先看看Javascript如何定义一个对象。下面是我们的一个对象定义: 还可以这样定义一个对象 对,你们没有看错,在Javascript里面,函数也是对象。 当然还可以 数组也是一个对象。 其他关于对象的基本的概念的描述,还是请各位亲们参见陈皓《Javascript 面向对象编程》文章。 对象都有了,唯一没有的就是class,因为在Javascript里面是没有class关键字的,算好还有function,function的存在让我们可以变通的定义类,在扩展这个主题前,我们还需要了解一个Javascript对象最重要的属性,__proto__成员。 __proto__成员 严格的说这个成员不应该叫这个名字,__proto__是Firefox中的称呼,__proto__只有在Firefox浏览器中才能被访问到。做为一个对象,当你访问其中的一个成员或方法的时候,如果这个对象中没有这个方法或成员,那么Javascript引擎将会访问这个对象的__proto__成员所指向的另外的一个对象,并在那个对象中查找指定的方法或成员,如果不能找到,那就会继续通过那个对象的__proto__成员指向的对象进行递归查找,直到这个链表结束。 好了,让我们举一个例子。 比如上上面定义的数组对象array1。当我们创建出array1这个对象的时候,array1实际在Javascript引擎中的对象模型如下: array1对象具有一个length属性值为3,但是我们可以通过如下的方法来为array1增加元素: push这个方法来自于array1的__proto__成员指向对象的一个方法(Array.prototye.push())。正是因为所有的数组对象(通过[]来创建的)都包含有一个指向同一个具有push,reverse等方法对象(Array.prototype)的__proto__成员,才使得这些数组对象可以使用push,reverse等方法。 那么这个__proto__这个属性就相当于面向对象中的”has a”关系,这样的的话,只要我们有一个模板对象比如Array.prototype这个对象,然后把其他的对象__proto__属性指向这个对象的话就完成了一种继承的模式。不错!我们完全可以这么干。但是别高兴的太早,这个属性只在FireFox中有效,其他的浏览器虽然也有属性,但是不能通过__proto__来访问,只能通过getPrototypeOf方法进行访问,而且这个属性是只读的。看来我们要在Javascript实现继承并不是很容易的事情啊。 函数对象prototype成员 首先我们先来看一段函数prototype成员的定义, When a function object is created, it is given a prototype member which is an object containing a constructor member which is a reference to the function object 当一个函数对象被创建时,这个函数对象就具有一个prototype成员,这个成员是一个对象,这个对象包含了一个构造子成员,这个构造子成员会指向这个函数对象。 例如: Base这个函数对象就具有一个prototype成员,关于构造子其实Base函数对象自身,为什么我们将这类函数称为构造子呢?原因是因为这类函数设计来和new 操作符一起使用的。为了和一般的函数对象有所区别,这类函数的首字母一般都大写。构造子的主要作用就是来创建一类相似的对象。 上面这段代码在Javascript引擎的对象模型是这样的 new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在Javascript中,我们将这类方式成为Pseudoclassical。 基于上面的例子,我们执行如下代码 这样代码的结果是什么,我们在Javascript引擎中看到的对象模型是: new操作符具体干了什么呢?其实很简单,就干了三件事情。 第一行,我们创建了一个空对象obj 第二行,我们将这个空对象的__proto__成员指向了Base函数对象prototype成员对象 第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量的值是”base”,关于call函数的用法,请参看陈皓《Javascript 面向对象编程》文章 如果我们给Base.prototype的对象添加一些函数会有什么效果呢? 例如代码如下: 那么当我们使用new创建一个新对象的时候,根据__proto__的特性,toString这个方法也可以做新对象的方法被访问到。于是我们看到了: 构造子中,我们来设置‘类'的成员变量(例如:例子中的id),构造子对象prototype中我们来设置‘类'的公共方法。于是通过函数对象和Javascript特有的__proto__与prototype成员及new操作符,模拟出类和类实例化的效果。 Pseudoclassical 继承 我们模拟类,那么继承又该怎么做呢?其实很简单,我们只要将构造子的prototype指向父类即可。例如我们设计一个Derive 类。如下 这段代码执行后的对象模型又是怎么样的呢?根据之前的推导,应该是如下的对象模型 这样我们的newObj也继承了基类Base的toString方法,并且具有自身的成员id。关于这个对象模型是如何被推导出来的就留给各位同学了,参照前面的描述,推导这个对象模型应该不难。 Pseudoclassical继承会让学过C++/Java的同学略微的感受到一点舒服,特别是new关键字,看到都特亲切,不过两者虽然相似,但是机理完全不同。当然不关什么样继承都是不能离不开__proto__成员的。 Prototypal继承 这是Javascript的另外一种继承方式,这个继承也就是之前陈皓文章《Javascript 面向对象编程》中create函数,非常可惜的是这个是ECMAScript V5的标准,支持V5的浏览器目前看来也就是IE9,Chrome最新版本和Firefox。虽然看着多,但是做为IE6的重灾区的中国,我建议各位还是避免使用create函数。好在没有create函数之前,Javascript的使用者已经设计出了等同于这个函数的。例如:我们看看Douglas Crockford的object函数。 例如如下代码段 上面函数的执行后的对象模型是: 如何形成这样的对象模型,原理也很简单,只要把object这个函数扩展一下,就能画出这个模型,怎么画留给读者自己去画吧。 这样的继承方式被称为原型继承。相对来说要比Pseudoclassical继承来的简单方便。ECMAScript V5正是因为这原因也才增加create函数,让开发者可以快速的实现原型继承。 上述两种继承方式是Javascript中最常用的继承方式。通过本文的讲解,你应该对Javascript的OO编程有了一些‘原理'级的了解了吧 参考: 《Prototypes and Inheritance in JavaScript Prototypes and Inheritance in JavaScript》Advance Javascript (Douglas Crockford 大神的视频,一定要看啊)题外话: web2.0后,web应用可谓飞速发展,如今在HTML5发布之际,浏览器的功能被大大强化,我感觉Browser远远在不是一个Browser那么简单了。记得C++之父曾经这样说过JAVA,JAVA不是跨平台,JAVA本身就是一个平台。如今的Browser也本身就是一个平台了,好在这个平台是基于标准的。如果Browser是平台,由于Browser安全沙箱的限制,个人电脑的资源被使用的很少,感觉Browser就是一个NC(Network Computer)?我们居然又回到了Sun最初提出的构想,Sun是不是太强大了些?

推荐整理分享再谈javascript面向对象编程(javascript面向),希望有所帮助,仅作参考,欢迎阅读内容。

再谈javascript面向对象编程(javascript面向)

文章相关热门搜索词:javascriptcom,@javascriptinterface,javascript面向对象编程指南,请问在javascript程序中,在javascript,细说javascript,在javascript,在javascript,内容如对您有帮助,希望把文章链接给更多的朋友!

Javascript面向对象扩展库代码分享 lang.js库提供了包和类的定义、类的继承与混合(mixin)、函数重载等功能,基本可满足大多数面向对象设计的需求。同时支持基于链式的定义方式,让

从面试题学习Javascript 面向对象(创建对象) 题目:try{varme=Man({fullname:"小红"});varshe=newMan({fullname:"小红"});console.group();console.info("我的名字是:"+me.attr("fullname")+"n我的性别是:"+me.attr("gender"));console.g

js面向对象 多种创建对象方法小结 开始创建对象:1.对象字面量。varclock={hour:,minute:,second:,showTime:function(){alert(this.hour+":"+this.minute+":"+this.second);}}clock.showTime();//调用2.创建Object实例varcl

标签: javascript面向

本文链接地址:https://www.jiuchutong.com/biancheng/385675.html 转载请保留说明!

上一篇:Javascript 面向对象编程(coolshell)(javascript面向对象 第三方类库)

下一篇:Javascript面向对象扩展库代码分享(javascript面向对象吗)

  • 税务师考试各科老师推荐
  • 计提个税会计分录怎么做小规模
  • 跨月冲红的发票怎么做会计分录
  • 营业成本包含折旧费吗
  • 开发票是否享受优惠政策
  • 存货暂估入账需要什么单据?
  • 土地结转会计分录是什么
  • 购买折让
  • 行政单位暂付款怎么记账
  • 企业清算时
  • 出租设备应计入什么科目
  • 开出转账支票怎么入账
  • 职工死去还有工资吗
  • 商贸有限公司要报地税吗
  • 已验旧和未验旧
  • 跨年度的成本费用发票怎么入账
  • 出口退税进项税额转出的计算
  • 个体户小规模纳税人每月开票
  • 公司的电话费计入什么科目
  • 借应收账款贷应收账款是什么意思
  • 增值税免税标准30万含不含税
  • 往来款核销需要如何确认
  • vc_runtimeMinimum_x64.msi 找不到的解决方法
  • 隐藏资源管理器里的cd驱动器
  • 汇算清缴退税怎么调整金额
  • 收到稳岗补贴计入哪个科目
  • mac鼠标移动到角落立刻显示桌面
  • 公司开业厂商的宣传文案
  • 汇算清缴是哪个报表
  • win10 ltsc版
  • 网络环境中存在不同网段的nvr
  • macOS Big Sur 11.1 开发者预览版 Beta 2推送更新
  • echarts饼图背景图片
  • 最早能玩游戏的人
  • anaconda的虚拟环境的作用
  • 房屋权属变更什么意思
  • php操作mysql数据库
  • 赡养老人专项扣除标准
  • 蓝桥杯2021出结果
  • AttributeError: cannot assign module before Module.__init__() call
  • 上市公司发行股票会计分录
  • 材料采购是什么类科目
  • discuzcms
  • 小规模纳税人收入超过500万怎么办
  • 应收账款收不回来做坏账处理分录
  • 关于预计净残值的计算题及答案
  • 自产产品用于职工福利按什么价格
  • 红冲作废怎么处理
  • 股东捐赠资产要纳税吗
  • 冲减备用金什么意思
  • 已经计提工资后怎么做账
  • 与成本直接相关的有哪些
  • 每月增值税怎么做账
  • 核销报验登记流程
  • 坏账收回所得税需要确认收入吗汇算清缴表如何填报
  • 自产委托加工的货物用于非增值税应税项目
  • 间接持股比例如何分析
  • 税控设备设置在哪儿
  • sql时间类型转换
  • Windows Sever 2016技术预览版3 本月发布
  • 如何备份还原电脑系统
  • quicklook预览word
  • windows无法配置在此硬件上运行
  • win7 word
  • win10关闭metro界面
  • win7 64位旗舰版设置插上耳机就能播放声音拔下耳机就自动禁音方法
  • linux命令使用例子
  • 在linux系统中,用来存在系统所需
  • opengl 投影矩阵
  • 设计模式三种
  • js date用法
  • android获取位置信息
  • pycharm安装教程2020.2
  • Node.js中的construct构造函数
  • 转换什么
  • 河南办税服务厅
  • 国家税务发票查验平台手机怎么查
  • 税务人的形象
  • 车船税的缴纳证明是什么意思?
  • 美国税务人员
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设