JavaScript接口的实现三种方式(推荐)


Posted in Javascript onJune 14, 2016

Javascript模仿接口可以有三种方式:1.注释法 2.检查属性法 3.鸭式辨形法

1.注释法:此方法属于程序文档范畴,对接口的继承实现完全依靠程序员自觉

/*
interface People{
function createHead();
function createBody();
}
*/
var woman = function(name){ //implements People interface
this.name = name;
}
woman.prototype.showName = function(){
alert(this.name);
}
woman.prototype.createBody = function(){ //实现必要的方法
alert("身体已经创建好");
}
woman.prototype.createHead = function(){
alert("头部已经创建好");
}

//2.属性检查法:把要实现的接口方法添加到类属性列表里,通过定义好的检测反复检查是否已经实现了那些方法
//优缺点:可以强迫程序员实现接口,没实现就报错。不过虽然声明了自己实现了哪些方法,但实现时很可能有遗漏

/*
interface People{
function createHead();
function createBody();
}
*/
var woman = function(name){
this.name = name;
this.implementsInterfaces = ['People'];
}
woman.prototype.showName = function(){
alert(this.name);
}
woman.prototype.createBody = function(){ //实现必要的方法
alert("身体已经创建好");
}
woman.prototype.createHead = function(){
alert("头部已经创建好");
}
function implement(obj,interfaces){
for(var i=1;i<interfaces.length;i++){
var interfaceName = interfaces[i];
var interfaceFound = false;
for(var j=0;j<obj.implementsInterfaces.length;j++){
if(obj.implementsInterfaces[j] = interfaceName){
interfaceFound = true;
break;
}
}
if(!interfaceFound){
return false;
}
}
return true;
}
function isImplememts(instance,interfaces){ //判断对象是否已经继承相应接口
if(!implement(instance,interfaces)){
throw new Error("Object doesn't implement a required interface");
}
}

3.鸭式辨型法:(不通过外表判断鸭子,而通过其是否有鸭子的特性来判断。如James Whitcomb Riley所说,像鸭子一样走路并且嘎嘎叫的就是鸭子)

上面俩种都声明了自己实现了那些接口,其实声明不重要,实现接口核心的是类实现了接口方法集。如果类具有了接口定义的所有方法函数名相同的函数,那么认为它实现了接口

//接口类,用来创建接口
var Interface = function(name,motheds){
if(agruments.length!=2){
throw new Error("Interface constructor called with "+arguments.length+"arguments,but expected exactly 2");
}
this.name = name;
this.methods = [];
for(var i=0;i<motheds.length;i++){
if(typeof motheds[i] !== 'string'){
throw new Error('Interface constructor expects mothed names to be'+'passes in as a string');
}
this.methods.push(motheds[i]);
}
}
Interface.prototype.ensureImplements = function(objs){
if(agruments.length != 1){
throw new Error("Interface constructor called with "+arguments.length+"arguments,but expected exactly 1")
}
for(var i=0;i<objs.length;i++){
var obj = objs[i];
for(var j=0;j<this.motheds.length;j++){
var mothed = this.methods[j];
if(!obj[mothed] || !typeof obj[mothed] !== 'function'){
throw new Error('Function Interface.ensureImplements:implements interface'+this.name+',obj.mothed'+mothed+'was not found');
}
}
}
}
//创建接口
var People = new Interface('People',['createHead','createBody']);
//子类
var Woman = function(name){
this.name = name;
this.implementsInterfaces = ['People'];
}
Woman.prototype.showName = function(){
alert(this.name);
}
Woman.prototype.createBody = function(){ //实现必要的方法
alert("女人身体已经创建好");
}
Woman.prototype.createHead = function(){
alert("女人头部已经创建好");
}
//子类
var Man = function(name){
this.name = name;
this.implementsInterfaces = ['People'];
}
Man.prototype.showName = function(){
alert(this.name);
}
Man.prototype.createBody = function(){ //实现必要的方法
alert("男人身体已经创建好");
}
Man.prototype.createHead = function(){
alert("男人头部已经创建好");
}
//判断是否实现
Poeple.ensureImplements(['Woman','Man']);
Javascript 相关文章推荐
WordPress 插件——CoolCode使用方法与下载
Jul 02 Javascript
javascript 面向对象 function类
May 13 Javascript
Javascript 面向对象 对象(Object)
May 13 Javascript
JQuery select标签操作代码段
May 16 Javascript
js单词形式的运算符
May 06 Javascript
jQuery与getJson结合的用法实例
Aug 07 Javascript
JS常用倒计时代码实例总结
Feb 07 Javascript
BootStrap数据表格实例代码
Sep 13 Javascript
JavaScript框架Angular和React深度对比
Nov 20 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
Jul 23 jQuery
小程序识别身份证,银行卡,营业执照,驾照的实现
Nov 05 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
May 26 Javascript
jQuery处理XML文件的几种方法
Jun 14 #Javascript
你不需要jQuery(三) 新AJAX方法fetch()
Jun 14 #Javascript
深入理解jQuery 事件处理
Jun 14 #Javascript
使用jquery获取url及url参数的简单实例
Jun 14 #Javascript
JS操作JSON方法总结(推荐)
Jun 14 #Javascript
JavaScript Promise 用法
Jun 14 #Javascript
Javascript基础_简单比较undefined和null 值
Jun 14 #Javascript
You might like
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
实用函数9
2007/11/08 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
一些常用的JS功能函数代码
2009/06/23 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
Numpy之random函数使用学习
2019/01/29 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
python datetime中strptime用法详解
2019/08/29 Python
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
升职自荐信范文
2013/10/05 职场文书
文案策划专业自荐信
2014/07/07 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL