<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body>
<script>
//创建接口:注释描述接口/属性检测接口/鸭式辨型接口
(function() {
//注释描述接口实例 就是玩的文档游戏
/*
interface Composite(){
function add(arg);
function remove(arg);
function update(arg);
}
*/
//CompositeImpl implements Composite
//使用注释写一段伪码描述
var CompositeImpl = function() {} //为了避免每次实例化类 该类中所实现的接口方法频繁实例化 需要将方法实例添加在该类的原型对象中
//此处将this作为返回值 是为了实现链式调用
CompositeImpl.prototype = {
add: function(arg) {
console.info("接口中add方法被实现" + arg);
return this;
},
remove: function(arg) {
console.info("接口中remove方法被实现" + arg);
return this;
},
update: function(arg) {
console.info("接口中update方法被实现" + arg);
return this;
}
}
//实例化当前类调用被实现的方法
var compositeImpl = new CompositeImpl();
//compositeImpl.add("add").remove("remove").update("update");
})();
(function() {
//属性检测接口 就是扯淡 没有做到对方法的检测
//以文档的形式定义两个接口
/*
interface Composite(){
function add(arg);
function remove(arg);
function update(arg);
}
interface FormIte(){
function select();
}
* */
//CompositeImpl implements Composite,FormIte
var CompositeImpl = function() {
//需要在当前类的内部创建一个变量 用于存储当前类实现了那些接口 是一种规范
this.implementsInterface = ["Composite", "FormIte"];
}
CompositeImpl.prototype = {
add: function(arg) {
console.info("接口中add方法被实现");
return this;
},
remove: function(arg) {
console.info("接口中remove方法被实现");
return this;
},
update: function(arg) {
console.info("接口中update方法被实现");
return this;
},
select: function() {
console.info("接口中select方法被实现");
return this;
}
}
//检查当前实例的类中是否实现了继承接口中全部的方法
function CheckCompositeImpl(intance) {
if(!IsImplements(intance,"Composite", "FormIte")) {
throw new Error("当前类中没有实现全部的方法");
}
}
//创建一个公用具体的检测方法
function IsImplements(arg) {
for(var i = 1; i < arguments.length; i++) {
var interfaceName = arguments[i],
interfaceFound = false;
for(var j = 0; j < arg.implementsInterface.length; j++) {
if(arg.implementsInterface[j] == interfaceName) {
interfaceFound = true;
break;
};
}
if(!interfaceFound) {
return false;
}
}
return true;
}
var compositeImpl = new CompositeImpl();
CheckCompositeImpl(compositeImpl);
//compositeImpl.add();
})();
(function(){
//鸭式辨型实现接口(据说是最完美的) 核心是对方法的检查
//核心:一个类实现接口的动机就是实现接口中全部的方法 否则不叫实现
//1定义一个接口基类 让它实例化N多个接口 需要的的参数是 接口的名字 和 存储接口中方法名的数组
var Interface=function(name,methods ){
//1.判断实参的个数
if(arguments.length !=2){
throw new Error("参数不够");
}
this.name=name;
this.methods=[];
for(var i=0,len=methods.length;i<len;i++){
if(typeof methods[i] !=="string"){
throw new Error("方法名必须是String类型");
}
this.methods.push(methods[i]);
}
}
Interface.ensureImplements=function(object){
if(arguments.length<2){
throw new Error("参数个数不够")
}
for(var i=1,len=arguments.length;i<len;i++){
var interfaceName=arguments[i];
if(interfaceName.constructor !==Interface){
throw new Error("接口类型不匹配");
}
for(var j=0;j<interfaceName.methods.length;j++){
var methodName=interfaceName.methods[j];
if(! object[methodName] || typeof object[methodName] !== "function"){
throw new Error("方法不存在");
}
}
}
}
var CompositeInterface=new Interface("CompositeInterface",["add","remove"]);
var FormInterface=new Interface("FormInterface",["update","select"]);
//2. CompositeImpl impelments CompositeInterface , FormInterface
var CompositeImpl=function(){};
CompositeImpl.prototype={
add:function(){
console.info("add");
},
remove:function(){
console.info("remove");
},
update:function(){
console.info("update");
},
select:function(){
console.info("select");
}
}
var compositeImpl=new CompositeImpl();
Interface.ensureImplements(compositeImpl,CompositeInterface,FormInterface);
compositeImpl.add();
})()
</script>
</html>
java Script 接口实现 简单实例
最新推荐文章于 2023-02-22 10:58:43 发布