伪类

  • 一个函数对象被创建时,产生的函数对象会运行一个类似这样的代码this.prototype = { constructor: this };
  • 在我看来,这是原型的继承,类似于面向对象语言中类的继承
  • 这是基于构造器调用模式实现的继承,即使用new,但是书中并不推荐使用new
  • 一个原型继承的例子
Function.prototype.method = function (name, func) {this.prototype[name] = func;return this;
};var Mammal = function (name) {this.name = name;
};Mammal.method('get_name', function () {return this.name;}).method('says', function () {return this.saying || '';});var myMammal = new Mammal('Herb the Mammal');
var name = myMammal.get_name();
console.log(name); //值为Herb the Mammal/*令Cat继承Mammal
*/var Cat = function (name) {this.name = name;this.saying = 'meow';
};//继承Mammal、Cat拥有get_name、says方法
Cat.prototype = new Mammal();Cat.method('purr', function () {return 'this is purr';
});//覆盖Mammal的get_name方法,并不会影响Mammal自有的方法,只是优先调用这个
Cat.method('get_name', function () {return this.says() + ' ' + this.name + ' ' + this.says();
});var myCat = new Cat('Alex Xu');
var says = myCat.says(); //值为meow
var purr = myCat.purr(); //值为this is purr
var name = myCat.get_name(); //值为meow Alex Xu meow
console.log(says);
console.log(purr);
console.log(name);/* 继承的简化写法 */
Function.method('inherits', function (Parent) {this.prototype = new Parent();return this;
});var Catt = function (name) {this.name = name;this.saying = 'catt';}.inherits(Mammal).method('purr', function () {return 'this is purr';}).method('get_name', function () {return this.says() + ' ' + this.name + ' ' + this.says();});var myCatt = new Catt('hhee');
console.log(myCatt.get_name()); //catt hhee catt
console.log(myCatt.purr()); //this is purr

对象说明符

  • 如果一个对象的构造函数有过多的参数,可以使用对象作为参数,方便阅读
var NewCat = function (params) {this.name = params.name || 'None'; //默认值的情况this.age = params.age;this.weight = params.weight;this.brithday = params.brithday;return this;
};var nc = new NewCat({name: 'hhe',age: 2,weight: 3.3,brithday: '1997'
});
console.log(nc);

原型

  • 基于原型的继承方式,其实只是概念上的不同
  • 书上称之为差异化继承
if (typeof Object.beget !== 'function') {Object.create = function (o) {var F = function () {};F.prototype = o;return new F();};
}var baseObject = {name: 'base',get_name: function () {return this.name;},says: function () {return this.saying || '';}
};var childObject = Object.create(baseObject);
childObject.name = 'child';
childObject.saying = 'heiheihei';
childObject.purr = function () {console.log('this is prpr');
};
childObject.get_name = function () {return this.says() + ' ' + this.name + ' ' + this.says();
};console.log(childObject.get_name()); //heiheihei child heiheihei
console.log(childObject.says()); //heiheihei

函数化

  • 上面提及的继承模式都没法保护隐私,所有对象可见。也无法得到私有变量和私有函数
  • 利用函数化模式是更好的选择(回想一下闭包),函数化模式的实现步骤,以下步骤都在一个函数内
    1. 创建一个新对象
    2. 定义私有变量和方法,函数中通过var定义的普通变量
    3. 扩充方法,这些方法可以访问参数以及第二步中定义的私有变量
    4. 返回那个新对象
var baseObject = function (params) {//第一步:定义一个新对象var that;//第二步:定义私有变量var girl = 'girl';//第三步:扩充方法var that = {'get_girl': function () {//访问私有变量return girl;},'says': function () {//访问参数return params.saying;}};//第四步:返回新对象return that;
};var obj = baseObject();
console.log(obj.girl); //undefined
console.log(obj.get_girl()); //girl

JavaScript编程精粹——继承篇相关推荐

  1. JavaScript编程精粹

    JavaScript编程精粹 第 1 章 JavaScript入门 第 2 章 函数.闭包与模块 第 3 章 数据结构及相关操作 第 4 章 面向对象的JavaScript 第 5 章 JavaScr ...

  2. javascript语言精粹数组篇之Array的方法注意事项

    本文并没有详细列出Array方法详解,本文侧重点在于使用Array编程时候要注意的问题. 1.Array.concat var o = {name:"Gavin"}; var a1 ...

  3. 【第二篇】SAP HANA XS使用JavaScript编程详解

    前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 在第一篇的时候,我们说过如下内容: SAP HANA XS支持JavaScript中的服务器端应用程序编程.开发的服务器端 ...

  4. JavaScript语言精粹学习之继承

    JavaScript也有面对对象,面的对象很重要的一点就是继承,语言精粹中的继承篇章写的复杂难懂,且有些东西和现在的es6相比太过于老了,读完后这里我自己整理了一下JavaScript的继承,也对语言 ...

  5. 陪丈母娘学编程——JAVA之继承篇

    陪丈母娘学编程--JAVA之继承篇 概述继承 总结 写在前面:最近阿姨迷上了和我学JAVA,也同时迷上了张亮的"继承",为了和小丽在一起,我一定要留住阿姨,争取让她早日出师,我也早 ...

  6. 《JavaScript语言精粹 修订版》 读书笔记

    之前看到这篇文章, 前端网老姚浅谈:怎么学JavaScript?,说到怎么学习JavaScript,那就是 看书.分析源码. 10本书读2遍的好处,应该大于一本书读20遍. 看书主动学习,看视频是被动 ...

  7. 深入理解javascript函数系列第二篇——函数参数

    前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数.本文是深入理解javascript函数 ...

  8. 基于对象的JavaScript编程

    基于对象的JavaScript编程 -JavaScript Object-Oriented Programming By-Ryan Frishberg 接触ajax一直不是很深入,然后对于JavaSc ...

  9. JavaScript 进阶知识 - 高级篇

    JS高级 前言 经过前面几篇文章的学习,相信大家已经对js有了大部分的理解了,但是要想真正的掌握好js,本篇才是关键.由于js高级阶段的知识点比较难理解,所以本篇文章花了大量的时间去理思路,有可能有一 ...

最新文章

  1. for循环递减_讲讲关于循环的那些事
  2. 双喜临门,压力测试、曼谷会议,BCH成绩斐然
  3. 11.QT事件机制源码时序分析(下)
  4. zend 修改默认view路径,添加扩展view
  5. 各大计算机公司 笔试及面试 题目 - 人民搜索
  6. linux下安装Mysql(干货!!!)解决mysql 1130问题,远程登录问题
  7. oracle 换字段顺序,修改ORACLE的字段顺序
  8. hue集成mysql报错_hue集成hive访问报database is locked
  9. matlab2c使用c++实现matlab函数系列教程-poisspdf函数
  10. scrollview滑动到某区域执行某种方法
  11. Python基础语法-05-装饰器
  12. cmw500综合测试仪使用_辽宁优质继电器综合测试仪供应商-广州炫通电气科技
  13. hutool-all 导入Excel 文件 学习笔记
  14. 卡尔曼滤波和互补滤波的区别
  15. 励志c语言编码的开始,基础打开VS操作指南
  16. Maya 展UV和贴图
  17. ADSL拨号代理服务器实现HTTP代理的搭建过程
  18. win7系统没有telnet服务器,Win7系统没有telnet协议服务解决方法
  19. eclipse中转换项目编码时没有GBK的问题
  20. Layui数据表格每一行动态显示倒计时

热门文章

  1. mybatis查询一对多数据
  2. 【滤波估计】基于matlab双卡尔曼滤波SOC和SOH联合估计【含Matlab源码 2335期】
  3. Zhon库:Python文本处理利器!详细攻略带你玩转!
  4. Ubuntu 20.04 LTS 安装教程
  5. QQ空间伤感日志:眼泪流不尽,痛苦说不完
  6. python中素数的求法_用python怎么求素数
  7. 如何设计电商SPU与SKU表以及相关的表?
  8. 065.django之多表查询
  9. Android 进度条自动前进
  10. linux root hd0 0,root (hd0 0)讲解