javascript OOP(下)(九)

一、javascript模拟重载

java中根据参数类型和数量的区别来实现重载,javascript弱类型,没有直接的机制实现重载,javascript中参数类型不确定和参数个数任意,通过判断实际传入的参数的个数来实现重载。

<script>
function Person() {var args = arguments;if (typeof args[0] === 'object' && args[0]) { //判断第一个参数是否为对象,进行相应操作。传参为空时typeof null也是object,所以要同时判断args[0]不为空if (args[0].name) {this.name = args[0].name;}if (args[0].age) {this.age = args[0].age;}} else {if (args[0]) {this.name = args[0];}if (args[1]) {this.age = args[1];}}
}
//toString继承自Object,一般的对象toString会显示"[object Object]",没有什么意义,所以可以重新一下,方便输出 Person.prototype.toString
= function() {return 'name=' + this.name + ',age=' + this.age; }var bosn = new Person('Bosn', 27); bosn.toString(); //name=Bosn,age=27var lxy = new Person({name: 'lxy',age: 25 }); lxy.toString(); //name=lxy,age=25 </script>

二、调用基类方法

1、调用基类的方法进行初始化

基类人Person

学生Student

初始化Student的时候,初始化了className后需要初始化Person部分,可以通过

Person.call(this,name);调用基类的方法和属性。

<script>
function Person(name){this.name=name;
}
function Student(name,className){this.className=className;Person.call(this,name); //调用基类的构造器
}var bosn=new Student('Bosn','Network064');
console.log(bosn); 
</script>

输出时能够正确的被初始化。

2、子类覆盖了基类的方法

Student的init覆盖了Person的init,初始化Student时需要初始化Person,通过Person.prototype.init.apply(this,arguments);

<script>
Person.prototype.init=function(){};Student.prototype.init=function(){//do sthPerson.prototype.init.apply(this,arguments);
}
</script>

三、链式调用

 类似jquery选择器链式调用。

关键要在ClassManager.prototype.addClass操作完成后return this

<script>
function ClassManager(){//构造器
}ClassManager.prototype.addClass=function(str){ //在构造器上挂载一个方法,表示addClass
console.log('Class:'+str+' added.');
return this;// this总是指向ClassManager的实例,所以return就实现了链式调用
}var manager=new ClassManager();
manager.addClass('classA').addClass('classB').addClass('classC');
//Class:classA added.
//Class:classB added.
//Class:classC added.</script>

四、抽象类

 没有机制,可以进行模拟。主要是用throw new Error()

<script>
function DetectorBase(){throw new Error('Abstract class can not be invoked directly!');//在构造器里抛一个异常,防止抽象类被直接调用
}
DetectorBase.detect=function(){console.log('Detection starting...');}
DetectorBase.stop=function(){console.log('Detector stopped.');}
DetectorBase.init=function(){throw new Error('Error');//想要子类覆盖而不想被直接调用的方法,抛出异常
}function LinkDetector(){}
//通过Object.create实现继承
LinkDetector.prototype=Object.create(DetectorBase.prototype);
LinkDetector.prototype.constructor=LinkDetector;
</script>

五、definePrototype(ES5)

 

<script>
//ES5里面对于属性有一些getter setter方法,有一些标签
//configurable:能否delete
//enumberable:能否for in遍历
//writable:能否读写属性
//value:记录属性值,默认为undefine
//控制属性的访问情况function Person(name){//name可遍历,不可读写,不可删除Object.defineProperty(this,'name',{value:name,enumerable:true});
}
//ARMS_NUM相当于定义了一个常量,可枚举,不可写,不可删除
Object.defineProperty(Person,'ARMS_NUM',{value:2,enumerable:true});
Object.seal(Person.prototype); //Person在初始化之后不想被扩展,不想被配置了,用seal方法
Object.seal(Person);function Student(name,className){this.className=className;Person.call(this,name);
}
Student.prototype=Object.create(Person.prototype);
Student.prototype.constructor=Student;
</script>

六、模块化

模块化工具或者说类库有有seajs,requirejs等。

模块化的一般形式是:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有变量和函数的特权函数;最后返回这个特权函数,或者把它们保存到一个可访问到的地方。

1、通过返回一个对象实现简单模块化

<script>
var moduleA;//只需要把最核心的东西moduleA放到全局作用域
moduleA=function(){var prop=1;function func(){}return{ //func和prop不会被泄露到全局作用域
        func:func,prop:prop}
}() //moduleA用立即执行的匿名函数
</script>

2、通过返回this的方法实现简单模块化

通过new function(),通过设置this的值,我们知道通过new调用最后会返回this,除非你return的是一个对象。

<script>
//通过new默认返回this的方法
va moduleA;
moduleA=new function(){var prop=1;function func(){}this.func=func;this.prop=prop;
}
</script>

3、模块化应用【update20170307】

模块化可以摒弃全局变量的使用。促进了信息隐藏和其他优秀的设计实践。对于应用程序的封装,或者构造其他单例对象,模块模式非常有效。

模块模式也可以用来产生安全的对象。

例:构造一个用来产生序列号的对象。

<script>
var serial_maker=function(){
/*返回一个用来产生唯一字符串的对象。
唯一字符串由两部分组成:前缀+序列号。
该对象包含一个设置前缀的方法,一个设置序列号的方法和一个产生唯一字符串的gensym方法。
*/
var prefix='';
var seq=0;
return{set_prefix:function(p){prefix=String(p);},set_seq:function(s){seq=s;},gensym:function(){var result=prefix+seq;seq+=1;return result;}
}
};
var seqer=serial_maker();
seqer.set_prefix('Q');
seqer.set_seq(1000);
var unique;
unique=seqer.gensym(); 
console.log(unique);//unique是"Q1000"
unique=seqer.gensym(); 
console.log(unique);//unique是"Q1001"</script>

seqer()的3个方法都没有用到this或者that,因此没有办法损害seqer。除非调用对应的方法,否则没法改变prefix或seq的值。

seqer对象是可变的,所以它的方法可能会被替换掉,但替换后的方法依然不能访问私有变量。

比如:

seqer.gensym=function(){var result=prefix+seq;seq+=3;console.log(seq);return result;
}

就会报错,因为替换后的方法不能访问私有变量。

seqer就是一组函数的集合,而且那些函数被授予特权,拥有使用或修改私有状态的能力。

如果我们把seqer.gensym作为一个值传递给第三方函数,那个函数能用它产生唯一字符串,却不能通过修改它来改变prefix或seq的值。

参考:

js模块化历程

http://www.cnblogs.com/lvdabao/p/js-modules-develop.html

写了十年JS却不知道模块化为何物?

https://blog.wilddog.com/?p=587

 深入浅出ES6(十三):类 Class

http://www.infoq.com/cn/articles/es6-in-depth-classes/

 

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/4904929.html有问题欢迎与我讨论,共同进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux如何查找大文件或目录总结

转载&#xff1a;http://www.cnblogs.com/kerrycode/p/4391859.html 在Windows系统中&#xff0c;我们可以使用TreeSize工具查找一些大文件或文件夹&#xff0c;非常的方便高效&#xff0c;在Linux系统中&#xff0c;如何去搜索一些比较大的文件呢&#xff1f;下面我整理了一下…

java需要会的工具_Java开发者必备的几款工具,一定要掌握!

原标题&#xff1a;Java开发者必备的几款工具&#xff0c;一定要掌握&#xff01;NotepadNotepad是用于编辑xml、脚本以及记笔记的最佳工具。这个工具的最好部分在于&#xff0c;你在Notepad上打开的任何一个文档&#xff0c;在关闭后都会有一个残留文档&#xff0c;它有助于在…

Android推荐的几本书

2019独角兽企业重金招聘Python工程师标准>>> 第一阶段 <<第一行代码Android>><<疯狂Android>>第二阶段 <<Android开发艺术探索>><<Android群英传>>Android源码 第三阶段 <<Android开发艺术探索>><&…

tdr上升时间什么设定_TDR的完整形式是什么?

tdr上升时间什么设定TDR&#xff1a;时域反射仪/车票寄存收据/定期存款收据 (TDR: Time Domain Reflectometer/ Ticket Deposit Receipt/ Term Deposit Receipt) 1)TDR&#xff1a;时域反射仪 (1) TDR: Time Domain Reflectometer) TDR is an abbreviation of the "Time D…

【java】反射+poi 导出excel

2019独角兽企业重金招聘Python工程师标准>>> 反射 导出的数组转变成对象 private static Object expexcelMaptobean(Class<?> cobj,Map<String,String> map,int[] expColums,String[] params) throws InstantiationException, IllegalAccessException…

css设置背景图片大小_如何使用CSS设置背景图片大小?

css设置背景图片大小Introduction: 介绍&#xff1a; As we all know that the images are a very responsive yet very creative way to display your web page or website to the users. The images also play a major role in indulging users to websites or web pages. T…

avr计数_使用8位LCD创建计数器| AVR

avr计数This type of counter may be also used in the EVM machines. A counter can be used to count the number of times a button is pressed. It can have many applications. The most widely used counter application is in EVM and also in customer feedback machin…

php将字符变为数字,数字字符怎么转化为数字 php 怎么将字符转成数字

java中&#xff0c;String字符串转化为数字我现在想把一个String字符串转化为数字&#xff0c; String s"00000123" 我直接使java中String字符串转化为数字&#xff1a; 转换为浮点型&#xff1a; 使用Double或者Float的parseDouble或者parseFloat方法进行转换 Strin…

用U盘作为启动盘做系统步骤

步骤一&#xff1a;BIOS设置U盘启动 制作好Win10 U盘系统安装盘之后&#xff0c;我们需要在电脑的BIOS设置中把第一启动设备设置为U盘&#xff0c;设置后就可以从我们制作的Win10 U盘系统安装盘启动&#xff0c;从而显示系统安装界面开始安装系统。BIOS设置U盘启动的方法如下&a…

使用tkinter模块在Python中进行GUI编程

GUI (Graphical User Interface): GUI(图形用户界面)&#xff1a; GUI is a simple application which helps the user to interact with the computer or any other electronic device through a graphical icon. This used to perform different tasks on a desktop or lapt…

Composer学习之————Ubuntu14.04下安装Composer

下载Composer&#xff1a; curl -sS https://getcomposer.org/installer | php 安装Composer&#xff1a; /usr/bin/php composer.phar --version 设置全局命令&#xff1a; sudo mv composer.phar /usr/local/bin/composer 查看是否安装与设置成功&#xff1a; composer -vers…

java如何解决高并发症,JAVA线上故障紧急处理详细过程!

链接&#xff1a;https://fredal.xin/java-error-check?hmsrtoutiao.io&utm_mediumtoutiao.io&utm_sourcetoutiao.io线上故障主要会包括 CPU、磁盘、内存以及网络问题&#xff0c;而大多数故障可能会包含不止一个层面的问题&#xff0c;所以进行排查时候尽量四个方面依…

php 查看扩展 代码,[扩展推荐] 使用 PHP Insights 在终端查看 PHP 项目代码质量

PHP Insights 是一个由 Nuno Maduro 发布的、可在控制台进行 PHP 即时质量检查的拓展包。在项目的 readme 文件中&#xff0c;可以发现 PHP Insights 的主要功能包含&#xff1a;代码质量 与 代码风格 分析一个针对于代码 结构 和 复杂度 的漂亮的预览界面在 Laravel、Symfon…

航空机票预订c#代码_航空公司座位预订问题的C ++程序

航空机票预订c#代码Problem statement: Write a program to assign passengers seats in an airplane. Assume a small airplane with seat numbering as follows: 问题陈述&#xff1a;编写一个程序来分配飞机上的乘客座位。 假设小型飞机的座位编号如下&#xff1a; 1 A B C…

linux命令之which

which这个命令可以说并不常用&#xff0c;它的作用是查看可执行文件的位置&#xff0c;并返回第一个搜索结果。可执行文件也就是指的某个系统命令&#xff0c;但是这个命令的位置必须是在PATH路径里存在的。截图中 &#xff0c;pwd的位置在/bin/pwd,当然&#xff0c;这个路径是…

线性代数向量乘法_向量的标量乘法| 使用Python的线性代数

线性代数向量乘法Prerequisite: Linear Algebra | Defining a Vector 先决条件&#xff1a; 线性代数| 定义向量 Linear algebra is the branch of mathematics concerning linear equations by using vector spaces and through matrices. In other words, a vector is a mat…

html的学习思维导图

转载于:https://www.cnblogs.com/lingdublog/p/6438088.html

cubic-bezier_带CSS中的示例的cube-bezier()函数

cubic-bezierIntroduction: 介绍&#xff1a; How many times have we come across the word function? Well, it would not be wrong to say a lot. The fact that functions are used in web development while developing a website or web page is very important. There…

上手Caffe(一)

author&#xff1a;oneBite 本文记录编译使用caffe for windows 使用环境 VS2013 ultimate,win7 sp1,caffe-windows源码&#xff08;从github上下载caffe的windows分支&#xff0c;下载解压之后&#xff0c;不要改变原有的目录结构,因为solution rebuild时会使用文件的相对路径…

关于设置不同linux主机之间ssh免密登录简易方法

2019独角兽企业重金招聘Python工程师标准>>> 在linux日常中&#xff0c;经常会有ssh链接其他主机服务器的action,也学习过大家日常用配置ssh免密登录的方法。 小编今天在这里给大家介绍一种比较简单的配置linux主机ssh免密登录的方法。 两台主机的IP地址&#xff1a…