位置: 编程技术 - 正文

javascript 面向对象编程基础:继承(javascript面向对象 第三方类库)

编辑:rootadmin
我们看到这里继承的概念是多么的直白,“拷贝一个类的prototype 到另外一个类”,好,Code is cheap,看代码: function class1() { } function class2() { } class2.prototype = class1.prototype; class2.moreProperty1 = " class 2 additional string " ; class2.moreMethod1 = function () { alert( " class 2 additional method " ); } /* 这样,首先是class2具有了和class1 一样的prototype,不考虑构造函数,两个类是等价的。 随后,又通过prototype给class2赋予了两个额外的方法。所以class2是在class1的基础上 增加了属性和方法,这就实现了类的继承。 */ function test() { var obj = new class2(); // JavaScript提供了instanceof 操作符来判断一个对象是否是某个类的实例 alert(obj instanceof class2); // true alert(obj instanceof class1); // ? } 运行代码,结果是不是在我们的意料之中?表面上看,上面的实现完全可行,js也可以正确的理解和实现这种继承关系,obj同时是class1和 class2的实例,但实质上则不然(我们学习的目的是要知其然更要知其所以然)。js的这种理解实际上是基于一种很简单的策略,看下面的代码,先使用 prototype让class2 继承于class1,再在class2 中重复定义method 方法: // 定义class1 function class1() { // 构造函数 } // 定义class1 的成员 class1.prototype = { m1: function () { // 方法1 alert( " class1 method1 " ); } } // 定义class2 function class2() { // 构造函数 } // 让class2 继承于class1 class2.prototype = class1.prototype; // 给class2 重复定义方法method class2.prototype.method = function () { alert( " whose method2? class1 or class2 " ); } // 创建两个类的实例 var obj1 = new class1(); var obj2 = new class2(); function test() { // 分别调用两个对象的method 方法 obj1.method(); obj2.method(); } 从代码执行结果看,method方法在class1,2中运行的结果是相同的。 由此可见,当对class2 进行prototype 的改变时,class1的prototype也随之改变,即使对class2 的prototype 增减一些成员,class1的成员也随之改变。所以class1 和class2 仅仅是构造函数不同的两个类,它们保持着相同的成员定义。说到这里,相信读者已经发现了其中的奥妙:class1 和class2 的prototype 是完全相同的,是对同一个对象的引用。其实从这条赋值语句就可以看出来: //让class2 继承于class1 class2.prototype=class1.prototype; 在js中,除了基本的数据类型(数字、字符串、布尔类型等),所有的赋值以及函数参数都是引用传递,而不是值传递。所以上面的语句仅仅是让class2 的prototype 对象引用class1 的prototype,造成了类成员定义始终保持一致的效果。从这里也看到了instanceof 操作符的执行机制,它就是判断一个对象是否是一个prototype 的实例,因为这里的obj1 和obj2 都是对应于同一个prototype,所以它们instanceof 的结果都是相同的。由此可见,使用prototype 引用拷贝实现继承不是一种正确的办法。但在要求不严格的情况下,却也是一种合理的方法,唯一的约束是不允许类成员的覆盖定义(这里其实也是js的灵活性的体现)。其实,我们完全可以利用反射机制和prototype 来实现js正确的类继承: function class1() { // 构造函数 } class1.prototype = { method: function () { alert( " method1 " ); }, method2: function () { alert( " method2 " ); } } function class2() { // 构造函数 } // 让class2 继承于class1 for ( var p in class1.prototype) { class2.prototype[p] = class1.prototype[p]; // 利用反射机制和prototype实现继承 } // 覆盖定义class1中的method 方法 class2.prototype.method = function () { alert( " class2 new method1 " ); } // 创建两个类的实例 var obj1 = new class1(); var obj2 = new class2(); function test() { // 分别调用两个对象的method 方法 obj1.method(); obj2.method(); // 分别调用两个对象的method2 方法 obj1.method2(); obj2.method2(); } 从运行结果可见,obj2中重复定义的method 已经覆盖了继承的method方法,同时method2 方法未受影响。而且obj1中的method 方法仍然保持了原有的定义。这样,就实现了正确意义的类的继承。为了方便开发,可以为每个类添加一个共有的方法,用以实现类的继承: // 为类添加静态方法inherit表示继承于某类 Function.prototype.inherit = function (baseClass) { for ( var p in baseClass.prototype) { this .prototype[p] = baseClass.prototype[p]; } } function class1() { // 构造函数 } class1.prototype = { method: function () { alert( " method1 " ); }, method2: function () { alert( " method2 " ); } } function class2() { // 构造函数 } // 让class2 继承于class1 // for (var p in class1.prototype) { // class2.prototype[p] = class1.prototype[p]; // 利用反射机制和prototype实现继承 // } class2.inherit(class1); // 等价于上面注释掉的那一个for循环 // 覆盖定义class1中的method 方法 class2.prototype.method = function () { alert( " class2 new method1 " ); } // 创建两个类的实例 var obj1 = new class1(); var obj2 = new class2(); function test() { // 分别调用两个对象的method 方法 obj1.method(); obj2.method(); // 分别调用两个对象的method2 方法 obj1.method2(); obj2.method2(); } 上面的代码使逻辑变的更加清楚,也更容易理解。通过这种方法实现的继承,有一个缺点,就是在class2 中添加类成员定义时,不能给prototype 直接赋值,而只能对其属性进行赋值,例如不能为: class2.prototype={ //成员定义 } 而只能为: class2.prototype.propertyName=someValue; class2.prototype.methodName=function(){ //语句 } 由此可见,这样实现继承仍然要以牺牲一定的代码可读性为代价。有没有“不仅基类可以用对象直接赋值给property,而且在派生类中也可以同样实现,使代码逻辑更加清晰,也更能体现面向对象的语言特点”的js继承方式?引号里的说法是多么的诱人啊,继续学习去了。

推荐整理分享javascript 面向对象编程基础:继承(javascript面向对象 第三方类库),希望有所帮助,仅作参考,欢迎阅读内容。

javascript 面向对象编程基础:继承(javascript面向对象 第三方类库)

文章相关热门搜索词:javascript面向对象吗,javascript面向对象编程指南 pdf,javascript面向对象编程,javascript面向对象编程指南 pdf,javascript面向对象吗,javascript面向对象编程指南第三版,javascript面向对象编程,javascript面向对象编程,内容如对您有帮助,希望把文章链接给更多的朋友!

javascript 面向对象编程基础 多态 Javascript已经可以模拟出面向对象的封装和继承特性,但是不幸的是Javascript对多态特性的支持非常弱!其它面向对象语言的多态一般都由方法重载和虚方

一个简单的javascript类定义例子 script//定义一个javascript类functionJsClass(privateParam/**/,publicParam){//构造函数varpriMember=privateParam;//私有变量this.pubMember=publicParam;//公共变量//定义私有方法functi

javascript 类定义的4种方法 /*工厂方式---创建并返回特定类型的对象的工厂函数(factoryfunction)*/functioncreateCar(color,doors,mpg){vartempCar=newObject;tempCar.color=color;tempCar.doors=doors;tempCar.mpg=m

标签: javascript面向对象 第三方类库

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

上一篇:javascript 面向对象编程基础:封装(javascript面向对象编程)

下一篇:javascript 面向对象编程基础 多态(javascript面向对象精要)

  • 费用的进项税额可以抵扣吗
  • 怎么证明自己是建档立卡贫困户
  • 普通发票可以抵税点吗
  • 建筑类企业是否允许留抵
  • 酒店购买的空调折旧计入管理费用吗
  • 印花税怎么计提和缴纳
  • 投资收益收到的现金小于投资收益
  • 其他应收款要做账吗
  • 领用原材料 会计分录
  • 一人有限公司年度审计报告
  • 金融服务费进项可以抵扣吗
  • 企业会计准则和新会计准则的区别
  • 不动产出租需要缴纳哪些税
  • 发票能加盖公章吗
  • 基本户收到零余额转款怎么做分录
  • 进口设备在海关处保存2年出售时 计算税怎么算
  • 银行支付结算工作内容
  • 员工租房合同
  • 投资款打到个人账户算诈骗吗
  • 工会费入账科目
  • 法人转账到开户行的会计分录怎么做?
  • 房产税法律制度的重要内容
  • 个人开劳务发票要同时交个税吗?
  • 公司房产税如何计算器
  • 企业所得税预缴纳税申报表
  • 联营扣点怎么核算保本费用
  • 自产产品公益性捐赠可以免征增值税吗
  • 库存现金进账单会计分录
  • 财务杠杆系数简单计算方法
  • 苹果手机无法加入WiFi
  • 赔偿金要交增值税吗
  • 怎么将电脑硬盘做成移动硬盘
  • php getheader
  • PHP:mcrypt_module_is_block_mode()的用法_Mcrypt函数
  • 北极光的征兆
  • 工程的直接成本包括哪些
  • java如何实现异步处理
  • 2020年前端面试
  • python 如何学
  • php读取文件内容的方法和函数
  • 深究Python中的asyncio库-线程池
  • electron引入vue
  • mysql中regexp_substr函数的使用
  • 税控盘没有报税处理这个选项
  • 办理银行承兑汇票保证金比例
  • 进项转出了还能再转进去吗
  • 反射怎么解释
  • mysql如何判断日期是周末
  • 中付支付科技有限公司备付金
  • 计提固定资产折旧借方科目包括
  • 消费税是怎样征收的
  • 成本法和权益法的相同点
  • 固定制造费用差异的意义
  • 6月工资7月发8月申报
  • 去年多计提工资今年怎么进行损益调整
  • 机动车转让后未过户原车主要承担赔偿责任
  • 扣除员工餐费怎么做分录
  • 发票勾选认证成功了是不是就可以抵扣呀
  • 记账凭证填制的心得体会
  • sqlserver数据库备份
  • 用户画像
  • 自己动手制作
  • mac键盘怎么开
  • speedmgr.exe - speedmgr是什么进程 有什么用
  • linux特殊权限命令
  • 车钥匙失灵了10秒教你快速解决
  • 通过扣缴义务人申报和综合所得年度自行申报
  • android环境搭建教程
  • dos 批处理
  • ms-dos7.10如何安装
  • nodejs爬虫框架crawler
  • js的脚本语言
  • js函数function用法
  • 查看本机开放端口号
  • ajax+node+request爬取网络图片的实例(宅男福利)
  • unity检测tag
  • js 进阶
  • 建筑企业外地施工预缴税款
  • 出售144平方米以内的房子
  • 会议服务的服务定位是什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设