JavaScript编程精粹——继承篇
伪类
- 一个函数对象被创建时,产生的函数对象会运行一个类似这样的代码
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
函数化
- 上面提及的继承模式都没法保护隐私,所有对象可见。也无法得到私有变量和私有函数
- 利用函数化模式是更好的选择(回想一下闭包),函数化模式的实现步骤,以下步骤都在一个函数内
- 创建一个新对象
- 定义私有变量和方法,函数中通过var定义的普通变量
- 扩充方法,这些方法可以访问参数以及第二步中定义的私有变量
- 返回那个新对象
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编程精粹——继承篇相关推荐
- JavaScript编程精粹
JavaScript编程精粹 第 1 章 JavaScript入门 第 2 章 函数.闭包与模块 第 3 章 数据结构及相关操作 第 4 章 面向对象的JavaScript 第 5 章 JavaScr ...
- javascript语言精粹数组篇之Array的方法注意事项
本文并没有详细列出Array方法详解,本文侧重点在于使用Array编程时候要注意的问题. 1.Array.concat var o = {name:"Gavin"}; var a1 ...
- 【第二篇】SAP HANA XS使用JavaScript编程详解
前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 在第一篇的时候,我们说过如下内容: SAP HANA XS支持JavaScript中的服务器端应用程序编程.开发的服务器端 ...
- JavaScript语言精粹学习之继承
JavaScript也有面对对象,面的对象很重要的一点就是继承,语言精粹中的继承篇章写的复杂难懂,且有些东西和现在的es6相比太过于老了,读完后这里我自己整理了一下JavaScript的继承,也对语言 ...
- 陪丈母娘学编程——JAVA之继承篇
陪丈母娘学编程--JAVA之继承篇 概述继承 总结 写在前面:最近阿姨迷上了和我学JAVA,也同时迷上了张亮的"继承",为了和小丽在一起,我一定要留住阿姨,争取让她早日出师,我也早 ...
- 《JavaScript语言精粹 修订版》 读书笔记
之前看到这篇文章, 前端网老姚浅谈:怎么学JavaScript?,说到怎么学习JavaScript,那就是 看书.分析源码. 10本书读2遍的好处,应该大于一本书读20遍. 看书主动学习,看视频是被动 ...
- 深入理解javascript函数系列第二篇——函数参数
前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数.本文是深入理解javascript函数 ...
- 基于对象的JavaScript编程
基于对象的JavaScript编程 -JavaScript Object-Oriented Programming By-Ryan Frishberg 接触ajax一直不是很深入,然后对于JavaSc ...
- JavaScript 进阶知识 - 高级篇
JS高级 前言 经过前面几篇文章的学习,相信大家已经对js有了大部分的理解了,但是要想真正的掌握好js,本篇才是关键.由于js高级阶段的知识点比较难理解,所以本篇文章花了大量的时间去理思路,有可能有一 ...
最新文章
- for循环递减_讲讲关于循环的那些事
- 双喜临门,压力测试、曼谷会议,BCH成绩斐然
- 11.QT事件机制源码时序分析(下)
- zend 修改默认view路径,添加扩展view
- 各大计算机公司 笔试及面试 题目 - 人民搜索
- linux下安装Mysql(干货!!!)解决mysql 1130问题,远程登录问题
- oracle 换字段顺序,修改ORACLE的字段顺序
- hue集成mysql报错_hue集成hive访问报database is locked
- matlab2c使用c++实现matlab函数系列教程-poisspdf函数
- scrollview滑动到某区域执行某种方法
- Python基础语法-05-装饰器
- cmw500综合测试仪使用_辽宁优质继电器综合测试仪供应商-广州炫通电气科技
- hutool-all 导入Excel 文件 学习笔记
- 卡尔曼滤波和互补滤波的区别
- 励志c语言编码的开始,基础打开VS操作指南
- Maya 展UV和贴图
- ADSL拨号代理服务器实现HTTP代理的搭建过程
- win7系统没有telnet服务器,Win7系统没有telnet协议服务解决方法
- eclipse中转换项目编码时没有GBK的问题
- Layui数据表格每一行动态显示倒计时