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 window.confirm确认 取消对话框实现代码小结
Oct 21 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
May 19 Javascript
Javascript基础教程之函数对象和属性
Jan 18 Javascript
javascript跨域原因以及解决方案分享
Apr 08 Javascript
jQuery实现ctrl+enter(回车)提交表单
Oct 19 Javascript
js 定位到某个锚点的方法
Nov 19 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
Jul 21 Javascript
webpack实现热更新(实施同步刷新)
Jul 28 Javascript
vue proxyTable 接口跨域请求调试的示例
Sep 12 Javascript
基于js的变量提升和函数提升(详解)
Sep 17 Javascript
JS实现的碰撞检测与周期移动完整示例
Sep 02 Javascript
uniapp微信小程序:key失效的解决方法
Jan 20 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标签云的实现代码
2012/10/10 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
Pandas中resample方法详解
2019/07/02 Python
Python使用configparser读取ini配置文件
2020/05/25 Python
用python对oracle进行简单性能测试
2020/12/05 Python
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
new修饰符是起什么作用
2015/06/28 面试题
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
人力资源专业推荐信
2013/11/29 职场文书
市场部岗位职责
2015/02/12 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技