js 鸭式辨型法
无意中看到arr.length === +arr.length;这句代码,然后就去了解了下
这是一种鸭式辨型的判断方法。
鸭式辨型:像鸭子一样走路、游泳和嘎嘎叫的鸟就是鸭子
这句话表示:
a.arr有length这个属性
b.arr.length是一个Number
那么arr可以是array,也可以是string
Jquery中要判断一个变量是否是一个数组的确切方法:Object.prototype.toString.call(arr) === '[object Array]';
ES6可以通过 Array.isArray(arr)判断数组
那么鸭式辨型一般用在什么地方呢?
一般用在模拟接口的实现。、
js 没有class 和 interface,但是Js的interface可以通过模拟来实现
模拟实现接口有三种方法:
a.注释法(该方法全凭程序自觉去继承实现了)
- /*
- 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("头部已经创建好");
- }
b.属性检测法/*
- 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");
- }
- }
c.鸭式辨型法
- //接口类,用来创建接口
- 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']);
js 鸭式辨型法的更多相关文章
- js类型判断及鸭式辨型
目录 instanceof constructor 构造函数名字 鸭式辨型 三种检测对象的类方式: instanceof.constructor .构造函数名字 用法如下: 1)instanceof ...
- javascript鸭式辩型法实现接口
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- Chocolat.js – 响应式的 jQuery Lightbox 插件
Chocolat.js 使您能够显示一个或多个图像在同一页面上.给用户展示一组图片缩略图,可以显示全页或块.Chocolat.js 可以很好地处理所有主要的浏览器.它在下面这些浏览器测试通过:IE7+ ...
- Dense.js - 响应式的视网膜(Rtina)图像支持
Dense 是一款 jQuery 插件,它提供一个简单的方法为设备提供精密像素比的图像,为你的网站带来视网膜支持,清除模糊,图像更清晰.通过简单地包括 jQuery 插件的页面上,就能实现响应式的视网 ...
- ImageLightbox.js – 响应式的图片 Lightbox 插件
ImageLightbox.js 是一款很简洁的用于显示图片灯箱效果(Lightbox)的插件,没有字幕,导航按钮或默认背景.如果默认功能不够用的话,你可以很容易地自定义 JavaScript 函数扩 ...
- 深入js隐式类型转换
前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...
- vue.js响应式原理解析与实现
vue.js响应式原理解析与实现 从很久之前就已经接触过了angularjs了,当时就已经了解到,angularjs是通过脏检查来实现数据监测以及页面更新渲染.之后,再接触了vue.js,当时也一度很 ...
- 文件上传以及JS链式结构
文件上传: 文件上传使用FileUpload控件,使用控件的SaveAs方法,需要绝对路径. 获取文件的绝对路径:Server.MapPath(相对路径); 或许要上传文件的本身名字用.FileNam ...
- JS三大经典变量命名法
匈牙利命名法: 通过在变量名前面添加相应小写字母的符号标示作为前缀,标示出变量的作用域,类型等,前缀后面是一个或多个单词组合,单词描述了变量的用途,如i表示的是整数,s表示的是字符串.示例: var ...
随机推荐
- [NEUQ-OJ] 1012 SZ斐波拉契数列
一道水题,让我看清基础我的基础是多么薄弱. 递归,数组清零,数组名/变量名重复层出不穷...路漫漫啊.......... http://ncc.neuq.edu.cn/oj/problem.php?i ...
- Chapter 17_3 table的默认值
对象属性 有很多情况需要把有些属性绑定到某个对象,例如:函数与其名称.table的默认值.数组大小等... 当对象是一个table时,可以通过适当的key将属性存储在这个table中. 如果对象不是一 ...
- Flexslider图片轮播、文字图片相结合滑动切换效果
Flexslider是一款基于的jQuery内容滚动插件.它能让你轻松的创建内容滚动的效果,具有非常高的可定制性.开发者可以使用Flexslider轻松创建各种图片轮播效果.焦点图效果.图文混排滚动效 ...
- Framebuffer原理、使用、测试系列文章,非常好的资料,大家一起学习
转载:http://blog.csdn.net/tju355/article/details/6881372 *一.FrameBuffer的原理* FrameBuffer 是出现在 2.2.xx 内核 ...
- CVE-2015-0057 POC构造 & 利用分析(2015.7)
CVE-2015-0057 POC构造 & 利用分析 主要内容: 构造POC 利用思路 0x00 初探 从这篇文章可以获知: 1.问题出在 win32k!xxxEnableWndSBArrow ...
- .netER的未来路,关于基础是否重要和应该自己手写代码吗?
http://www.cnblogs.com/onepiece_wang/p/5558341.html#!comments 引用"基础知识的学习,一开始可能是背书,但是在后续若干年的工作过程 ...
- SEO定义目的,优化的好处
SEO:search engine optimization(搜索引擎优化) SEO严谨的定义:SEO是指在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中关键字 ...
- pip更换软件镜像源
家里的网络访问某些国外网站.下载安装包的时候总是连接不上或者下载速度特别慢, pypi.python.org就是其中一个.所以,使用pip给Python安装软件时,经常出现错误.修改pip连接的软件库 ...
- Android内存泄漏检测利器:LeakCanary
Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...
- fido-uaf-protocol-v1.0
EXAMPLE 1: Policy matching either a FPS-, or Face Recognition-based Authenticator { "accepted&q ...