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 相关文章推荐
javascript 自动填写表单的实现方法
Apr 09 Javascript
jQuery 全选/反选以及单击行改变背景色实例
Jul 02 Javascript
jquery配合css简单实现返回顶部效果
Sep 30 Javascript
IE浏览器中图片onload事件无效的解决方法
Apr 29 Javascript
项目中常用的JS方法整理
Jan 30 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
Aug 27 Javascript
几种经典排序算法的JS实现方法
Mar 25 Javascript
jQuery实现布局高宽自适应的简单实例
May 28 Javascript
JS创建对象的写法示例
Nov 04 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
Mar 07 Javascript
微信小程序云开发如何使用云函数生成二维码
May 18 Javascript
JS数组及对象遍历方法代码汇总
Jun 16 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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
PHP引用返回用法示例
2016/05/28 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
2016/01/26 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
angular2中使用第三方js库的实例
2018/02/26 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
node基于async/await对mysql进行封装
2019/06/20 Javascript
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
python 全文检索引擎详解
2017/04/25 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
对pandas中to_dict的用法详解
2018/06/05 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
html5+svg学习指南之SVG基础知识
2014/12/17 HTML / CSS
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
彪马法国官网:PUMA法国
2019/12/15 全球购物
农民致富事迹材料
2014/01/23 职场文书
商业门面租房协议书
2014/11/25 职场文书
承诺函范文
2015/01/21 职场文书
董事长开业致辞
2015/07/29 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python