无意中看到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.注释法(该方法全凭程序自觉去继承实现了)

  1. /*
  2. interface People{
  3. function createHead();
  4. function createBody();
  5. }
  6. */
  7. var woman = function(name){ //implements People interface
  8. this.name = name;
  9. }
  10. woman.prototype.showName = function(){
  11. alert(this.name);
  12. }
  13. woman.prototype.createBody = function(){ //实现必要的方法
  14. alert("身体已经创建好");
  15. }
  16. woman.prototype.createHead = function(){
  17. alert("头部已经创建好");
  18. }

  b.属性检测法/*

  1. interface People{
  2. function createHead();
  3. function createBody();
  4. }
  5. */
  6. var woman = function(name){
  7. this.name = name;
  8. this.implementsInterfaces = ['People'];
  9. }
  10. woman.prototype.showName = function(){
  11. alert(this.name);
  12. }
  13. woman.prototype.createBody = function(){ //实现必要的方法
  14. alert("身体已经创建好");
  15. }
  16. woman.prototype.createHead = function(){
  17. alert("头部已经创建好");
  18. }
  19. function implement(obj,interfaces){
  20. for(var i=1;i<interfaces.length;i++){
  21. var interfaceName = interfaces[i];
  22. var interfaceFound = false;
  23. for(var j=0;j<obj.implementsInterfaces.length;j++){
  24. if(obj.implementsInterfaces[j] = interfaceName){
  25. interfaceFound = true;
  26. break;
  27. }
  28. }
  29. if(!interfaceFound){
  30. return false;
  31. }
  32. }
  33. return true;
  34. }
  35. function isImplememts(instance,interfaces){ //判断对象是否已经继承相应接口
  36. if(!implement(instance,interfaces)){
  37. throw new Error("Object doesn't implement a required interface");
  38. }
  39. }

  c.鸭式辨型法

  1. //接口类,用来创建接口
  2. var Interface = function(name,motheds){
  3. if(agruments.length!=2){
  4. throw new Error("Interface constructor called with "+arguments.length+"arguments,but expected exactly 2");
  5. }
  6. this.name = name;
  7. this.methods = [];
  8. for(var i=0;i<motheds.length;i++){
  9. if(typeof motheds[i] !== 'string'){
  10. throw new Error('Interface constructor expects mothed names to be'+'passes in as a string');
  11. }
  12. this.methods.push(motheds[i]);
  13. }
  14. }
  15. Interface.prototype.ensureImplements = function(objs){
  16. if(agruments.length != 1){
  17. throw new Error("Interface constructor called with "+arguments.length+"arguments,but expected exactly 1")
  18. }
  19. for(var i=0;i<objs.length;i++){
  20. var obj = objs[i];
  21. for(var j=0;j<this.motheds.length;j++){
  22. var mothed = this.methods[j];
  23. if(!obj[mothed] || !typeof obj[mothed] !== 'function'){
  24. throw new Error('Function Interface.ensureImplements:implements interface'+this.name+',obj.mothed'+mothed+'was not found');
  25. }
  26. }
  27. }
  28. }
  29. //创建接口
  30. var People = new Interface('People',['createHead','createBody']);
  31. //子类
  32. var Woman = function(name){
  33. this.name = name;
  34. this.implementsInterfaces = ['People'];
  35. }
  36. Woman.prototype.showName = function(){
  37. alert(this.name);
  38. }
  39. Woman.prototype.createBody = function(){ //实现必要的方法
  40. alert("女人身体已经创建好");
  41. }
  42. Woman.prototype.createHead = function(){
  43. alert("女人头部已经创建好");
  44. }
  45. //子类
  46. var Man = function(name){
  47. this.name = name;
  48. this.implementsInterfaces = ['People'];
  49. }
  50. Man.prototype.showName = function(){
  51. alert(this.name);
  52. }
  53. Man.prototype.createBody = function(){ //实现必要的方法
  54. alert("男人身体已经创建好");
  55. }
  56. Man.prototype.createHead = function(){
  57. alert("男人头部已经创建好");
  58. }
  59. //判断是否实现
  60. Poeple.ensureImplements(['Woman','Man']);

js 鸭式辨型法的更多相关文章

  1. js类型判断及鸭式辨型

    目录 instanceof constructor 构造函数名字 鸭式辨型 三种检测对象的类方式: instanceof.constructor .构造函数名字 用法如下: 1)instanceof ...

  2. javascript鸭式辩型法实现接口

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. Chocolat.js – 响应式的 jQuery Lightbox 插件

    Chocolat.js 使您能够显示一个或多个图像在同一页面上.给用户展示一组图片缩略图,可以显示全页或块.Chocolat.js 可以很好地处理所有主要的浏览器.它在下面这些浏览器测试通过:IE7+ ...

  4. Dense.js - 响应式的视网膜(Rtina)图像支持

    Dense 是一款 jQuery 插件,它提供一个简单的方法为设备提供精密像素比的图像,为你的网站带来视网膜支持,清除模糊,图像更清晰.通过简单地包括 jQuery 插件的页面上,就能实现响应式的视网 ...

  5. ImageLightbox.js – 响应式的图片 Lightbox 插件

    ImageLightbox.js 是一款很简洁的用于显示图片灯箱效果(Lightbox)的插件,没有字幕,导航按钮或默认背景.如果默认功能不够用的话,你可以很容易地自定义 JavaScript 函数扩 ...

  6. 深入js隐式类型转换

    前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...

  7. vue.js响应式原理解析与实现

    vue.js响应式原理解析与实现 从很久之前就已经接触过了angularjs了,当时就已经了解到,angularjs是通过脏检查来实现数据监测以及页面更新渲染.之后,再接触了vue.js,当时也一度很 ...

  8. 文件上传以及JS链式结构

    文件上传: 文件上传使用FileUpload控件,使用控件的SaveAs方法,需要绝对路径. 获取文件的绝对路径:Server.MapPath(相对路径); 或许要上传文件的本身名字用.FileNam ...

  9. JS三大经典变量命名法

    匈牙利命名法: 通过在变量名前面添加相应小写字母的符号标示作为前缀,标示出变量的作用域,类型等,前缀后面是一个或多个单词组合,单词描述了变量的用途,如i表示的是整数,s表示的是字符串.示例: var ...

随机推荐

  1. [NEUQ-OJ] 1012 SZ斐波拉契数列

    一道水题,让我看清基础我的基础是多么薄弱. 递归,数组清零,数组名/变量名重复层出不穷...路漫漫啊.......... http://ncc.neuq.edu.cn/oj/problem.php?i ...

  2. Chapter 17_3 table的默认值

    对象属性 有很多情况需要把有些属性绑定到某个对象,例如:函数与其名称.table的默认值.数组大小等... 当对象是一个table时,可以通过适当的key将属性存储在这个table中. 如果对象不是一 ...

  3. Flexslider图片轮播、文字图片相结合滑动切换效果

    Flexslider是一款基于的jQuery内容滚动插件.它能让你轻松的创建内容滚动的效果,具有非常高的可定制性.开发者可以使用Flexslider轻松创建各种图片轮播效果.焦点图效果.图文混排滚动效 ...

  4. Framebuffer原理、使用、测试系列文章,非常好的资料,大家一起学习

    转载:http://blog.csdn.net/tju355/article/details/6881372 *一.FrameBuffer的原理* FrameBuffer 是出现在 2.2.xx 内核 ...

  5. CVE-2015-0057 POC构造 & 利用分析(2015.7)

    CVE-2015-0057 POC构造 & 利用分析 主要内容: 构造POC 利用思路 0x00 初探 从这篇文章可以获知: 1.问题出在 win32k!xxxEnableWndSBArrow ...

  6. .netER的未来路,关于基础是否重要和应该自己手写代码吗?

    http://www.cnblogs.com/onepiece_wang/p/5558341.html#!comments 引用"基础知识的学习,一开始可能是背书,但是在后续若干年的工作过程 ...

  7. SEO定义目的,优化的好处

    SEO:search engine optimization(搜索引擎优化) SEO严谨的定义:SEO是指在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中关键字 ...

  8. pip更换软件镜像源

    家里的网络访问某些国外网站.下载安装包的时候总是连接不上或者下载速度特别慢, pypi.python.org就是其中一个.所以,使用pip给Python安装软件时,经常出现错误.修改pip连接的软件库 ...

  9. Android内存泄漏检测利器:LeakCanary

    Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...

  10. fido-uaf-protocol-v1.0

    EXAMPLE 1: Policy matching either a FPS-, or Face Recognition-based Authenticator { "accepted&q ...