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,一经查实,立即删除!

相关文章

java calendar_Java Calendar getDisplayNames()方法与示例

java calendar日历类的getDisplayNames()方法 (Calendar Class getDisplayNames() method) getDisplayNames() method is available in java.util package. getDisplayNames()方法在java.util包中可用。 getDisplayNames() method is used to return Map that contains all fie…

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

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

java编写简单邮件_Javamail,编写简单的程序发送邮件

代码&#xff1a;package com.dai.mail; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.In…

java calendar_Java Calendar getLeastMaximum()方法与示例

java calendarCalendar类的getLeastMaximum()方法 (Calendar Class getLeastMaximum() method) getLeastMaximum() method is available in java.util package. getLeastMaximum()方法在java.util包中可用。 getLeastMaximum() method is used to get the least maximum value …

Shell 标准输入、输出和错误

防伪码&#xff1a;桃花潭水深千尺&#xff0c;不及汪伦送我情。文件描述符&#xff08;fd&#xff09;&#xff1a;文件描述符是一个非负整数&#xff0c;在打开现存文件或新建文件时&#xff0c;内核会返回一个文件描述符&#xff0c;读写文件也需要使用文件描述符来访问文件…

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

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

java的equals方法_Java LocalDateTime类| 带示例的equals()方法

java的equals方法LocalDateTime类equals()方法 (LocalDateTime Class equals() method) equals() method is available in java.time package. equals()方法在java.time包中可用。 equals() method is used to check whether this date-time and the given object are equal or…

portlet java_Java Portlet 规范概述

前言1、portlet是一种类似servlet的规范。2、servlet是web组件&#xff0c;portlet也是web组件。参考1、百度百科&#xff1a;portlethttp://baike.baidu.com/link?urlvMzVwpkf5WzOL23GLkgM4C5C7Sarqh1XXShS73L7k-MbGgM0ooZ4Dl2Efor3bb4tZmmLo6v-muG5UW7_CYMTUahttp://hintcnu…

Java LocalDate类| minusWeeks()方法与示例

LocalDate类minusWeeks()方法 (LocalDate Class minusWeeks() method) minusWeeks() method is available in java.time package. minusWeeks()方法在java.time包中可用。 minusWeeks() method is used to subtract the given weeks from this LocalDate and return the LocalD…

Android推荐的几本书

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

java数据类型后缀_java基础知识---基本数据类型

1)四种整数类型(byte、short、int、long)&#xff1a;byte&#xff1a;8 位&#xff0c;用于表示最小数据单位&#xff0c;如文件中数据&#xff0c;-128~127short&#xff1a;16 位&#xff0c;很少用&#xff0c;-32768 ~ 32767int&#xff1a;32 位、最常用&#xff0c;-2^3…

duration java_Java Duration类| minusMillis()方法与示例

duration java持续时间类minusMillis()方法 (Duration Class minusMillis() method) minusMillis() method is available in java.time package. minusMillis()方法在java.time包中可用。 minusMillis() method is used to subtract the given duration in milliseconds from t…

Thread 和 Runnable创建新线程的区别,Runnable可以共享线程类的实例属性

Thread实现多线程&#xff1a; public class Thread2 extends Thread{ public int i; public void run(){ for(; i < 100 ;i) { System.out.println(getName() " " i); } } public static void main(String[] args){ for (int j 0; j < 100; j) { System…

java编程求最小公约数_java求最大公约数与最小公倍数

public class Gongyueshu{public static void main(String[] args){//从控制台输入两个数据int m Integer.parseInt(args[0]);int n Integer.parseInt(args[1]);int y 1 ;int b 1;if (m > 0 && n >0){//先判定这两个数是否为倍数关系&#xff0c;如果是则小数…

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…

java gc的特性_Java12新特性 -- 可中断的G1 Mixed GC

Java 12 中增强了 G1 垃圾收集器关于混合收集集合的处理策略&#xff0c;这节主要介绍在 Java 12 中同时也对 G1垃圾回收器进行了改进&#xff0c;使其能够在空闲时自动将 Java 堆内存返还给操作系统&#xff0c;这也是 Java 12 中的另外一项重大改进。目前 Java 11 版本中包含…

在Python3中将字符串转换为字节的最佳方法

To convert a string to bytes, there are more than one way, 要将字符串转换为字节&#xff0c;有多种方法&#xff0c; Approach 1: use encode() method 方法1&#xff1a;使用encode()方法 test_str "include_help"print(type(test_str))test_bytes test_st…

【Java】PMD规则学习(1) --字符串比较

PMD是一款采用BSD协议发布的Java程序代码检查工具。该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等。该软件功能强大&#xff0c;扫描效率高&#xff0c;是Java程序员debug的好帮手。 PMD支持的编辑器包括&#xff1a;JDevelo…