- 浏览: 88673 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
zhaohaolin:
哟,龙哥,你还搞C,好高大上的东西啊
xcode初探 -
robinqu:
又改了一些小错误~
[更新20100922]jQuery Location Select 插件- 地址联动、地理检测 -
robinqu:
kimm 写道这个功能不错,就是应用有点局限,内网就不好用了。 ...
[更新20100922]jQuery Location Select 插件- 地址联动、地理检测 -
robinqu:
更新了⋯⋯把代码重写了一次⋯⋯大家可以实现任何种类的联动,以及 ...
[更新20100922]jQuery Location Select 插件- 地址联动、地理检测 -
robinqu:
truth315 写道不好意思了,compu指的是getAre ...
JavaScript Prototype基础
Duck Typing
Duck Typing的假设如下,如果一个对象实现了一个类中的所有方法,那么这个对象就是这个类的实例。
Duck Typing和之前讲的“方法借用”一起就非常有用,在Duck Typing的假设下,你的确可以说之前例子中的Rectangle是GenricEquals的实例。但是instanceof并不这么认为,我们只有自己写一个方法来判断:
这个borrow()函数严格的判断这个对象是否实现了类中的所有方法,但有时候我们的Duck Typing需要更加灵活。我们只需要这个对象提供了同名方法,以及方法的参数一致就可以了。
下面是实现这种判定的函数:
下面给出一个实际的使用环境。假设Comparable()是一个通用的API接口,我们用provide()函数就可以判定某个对象是否拥有了Comparable中的同名方法,也就是有没有类似的compareTo()方法:
最后给一个定义类的函数,老外实在太NB了,自己看注释吧,虽然很长不过很清晰:
演示一下这东西怎么用:
引用
If it implements all the methods defined by a class, it is an instance of that class.
Duck typing is particularly useful in conjunction with classes that "borrow" methods from other classes. Earlier in the chapter, a Rectangle class borrowed the implementation of an equals( ) method from another class named GenericEquals. Thus, you can consider any Rectangle instance to also be an instance of GenericEquals. The instanceof operator will not report this, but you can define a method that will.
Duck typing is particularly useful in conjunction with classes that "borrow" methods from other classes. Earlier in the chapter, a Rectangle class borrowed the implementation of an equals( ) method from another class named GenericEquals. Thus, you can consider any Rectangle instance to also be an instance of GenericEquals. The instanceof operator will not report this, but you can define a method that will.
Duck Typing的假设如下,如果一个对象实现了一个类中的所有方法,那么这个对象就是这个类的实例。
Duck Typing和之前讲的“方法借用”一起就非常有用,在Duck Typing的假设下,你的确可以说之前例子中的Rectangle是GenricEquals的实例。但是instanceof并不这么认为,我们只有自己写一个方法来判断:
// Return true if each of the method properties in c.prototype have been // borrowed by o. If o is a function rather than an object, we // test the prototype of o rather than o itself. // Note that this function requires methods to be copied, not // reimplemented. If a class borrows a method and then overrides it, // this method will return false. function borrows(o, c) { // If we are an instance of something, then of course we have its methods if (o instanceof c) return true; // It is impossible to test whether the methods of a built-in type have // been borrowed, since the methods of built-in types are not enumerable. // We return undefined in this case as a kind of "I don't know" answer // instead of throwing an exception. Undefined behaves much like false, // but can be distinguished from false if the caller needs to. if (c == Array || c == Boolean || c == Date || c == Error || c == Function || c == Number || c == RegExp || c == String) return undefined; if (typeof o == "function") o = o.prototype; var proto = c.prototype; for(var p in proto) { // Ignore properties that are not functions if (typeof proto[p] != "function") continue; if (o[p] != proto[p]) return false; } return true; }
引用
The borrows( ) method of Example 9-7 is relatively strict: it requires the object o to have exact copies of the methods defined by the class c.
TRue duck typing is more flexible: o should be considered an instance of c as long as it provides methods that look like methods of c.
TRue duck typing is more flexible: o should be considered an instance of c as long as it provides methods that look like methods of c.
这个borrow()函数严格的判断这个对象是否实现了类中的所有方法,但有时候我们的Duck Typing需要更加灵活。我们只需要这个对象提供了同名方法,以及方法的参数一致就可以了。
下面是实现这种判定的函数:
// Return true if o has methods with the same name and arity as all // methods in c.prototype. Otherwise, return false. Throws an exception // if c is a built-in type with nonenumerable methods. function provides(o, c) { // If o actually is an instance of c, it obviously looks like c if (o instanceof c) return true; // If a constructor was passed instead of an object, use its prototype if (typeof o == "function") o = o.prototype; // The methods of built-in types are not enumerable, and we return // undefined. Otherwise, any object would appear to provide any of // the built-in types. if (c == Array || c == Boolean || c == Date || c == Error || c == Function || c == Number || c == RegExp || c == String) return undefined; var proto = c.prototype; for(var p in proto) { // Loop through all properties in c.prototype // Ignore properties that are not functions if (typeof proto[p] != "function") continue; // If o does not have a property by the same name, return false if (!(p in o)) return false; // If that property is not a function, return false if (typeof o[p] != "function") return false; // If the two functions are not declared with the same number // of arguments, return false. if (o[p].length != proto[p].length) return false; } // If all the methods check out, we can finally return true. return true; }
下面给出一个实际的使用环境。假设Comparable()是一个通用的API接口,我们用provide()函数就可以判定某个对象是否拥有了Comparable中的同名方法,也就是有没有类似的compareTo()方法:
function Comparable( ) {} Comparable.prototype.compareTo = function(that) { throw "Comparable.compareTo( ) is abstract. Don't invoke it!"; } // Check whether objects o and p can be compared // They must be of the same type, and that type must be comparable if (o.constructor == p.constructor && provides(o, Comparable)) { var order = o.compareTo(p); }
最后给一个定义类的函数,老外实在太NB了,自己看注释吧,虽然很长不过很清晰:
/** * defineClass( ) -- a utility function for defining JavaScript classes. * * This function expects a single object as its only argument. It defines * a new JavaScript class based on the data in that object and returns the * constructor function of the new class. This function handles the repetitive * tasks of defining classes: setting up the prototype object for correct * inheritance, copying methods from other types, and so on. * * The object passed as an argument should have some or all of the * following properties: * * name: The name of the class being defined. * If specified, this value will be stored in the classname * property of the prototype object. * * extend: The constructor of the class to be extended. If omitted, * the Object( ) constructor will be used. This value will * be stored in the superclass property of the prototype object. * * construct: The constructor function for the class. If omitted, a new * empty function will be used. This value becomes the return * value of the function, and is also stored in the constructor * property of the prototype object. * * methods: An object that specifies the instance methods (and other shared * properties) for the class. The properties of this object are * copied into the prototype object of the class. If omitted, * an empty object is used instead. Properties named * "classname", "superclass", and "constructor" are reserved * and should not be used in this object. * * statics: An object that specifies the static methods (and other static * properties) for the class. The properties of this object become * properties of the constructor function. If omitted, an empty * object is used instead. * * borrows: A constructor function or array of constructor functions. * The instance methods of each of the specified classes are copied * into the prototype object of this new class so that the * new class borrows the methods of each specified class. * Constructors are processed in the order they are specified, * so the methods of a class listed at the end of the array may * overwrite the methods of those specified earlier. Note that * borrowed methods are stored in the prototype object before * the properties of the methods object above. Therefore, * methods specified in the methods object can overwrite borrowed * methods. If this property is not specified, no methods are * borrowed. * * provides: A constructor function or array of constructor functions. * After the prototype object is fully initialized, this function * verifies that the prototype includes methods whose names and * number of arguments match the instance methods defined by each * of these classes. No methods are copied; this is simply an * assertion that this class "provides" the functionality of the * specified classes. If the assertion fails, this method will * throw an exception. If no exception is thrown, any * instance of the new class can also be considered (using "duck * typing") to be an instance of these other types. If this * property is not specified, no such verification is performed. **/ function defineClass(data) { // Extract the fields we'll use from the argument object. // Set up default values. var classname = data.name; var superclass = data.extend || Object; var constructor = data.construct || function( ) {}; var methods = data.methods || {}; var statics = data.statics || {}; var borrows; var provides; // Borrows may be a single constructor or an array of them. if (!data.borrows) borrows = []; else if (data.borrows instanceof Array) borrows = data.borrows; else borrows = [ data.borrows ]; // Ditto for the provides property. if (!data.provides) provides = []; else if (data.provides instanceof Array) provides = data.provides; else provides = [ data.provides ]; // Create the object that will become the prototype for our class. var proto = new superclass( ); // Delete any noninherited properties of this new prototype object. for(var p in proto) if (proto.hasOwnProperty(p)) delete proto[p]; // Borrow methods from "mixin" classes by copying to our prototype. for(var i = 0; i < borrows.length; i++) { var c = data.borrows[i]; borrows[i] = c; // Copy method properties from prototype of c to our prototype for(var p in c.prototype) { if (typeof c.prototype[p] != "function") continue; proto[p] = c.prototype[p]; } } // Copy instance methods to the prototype object // This may overwrite methods of the mixin classes for(var p in methods) proto[p] = methods[p]; // Set up the reserved "constructor", "superclass", and "classname" // properties of the prototype. proto.constructor = constructor; proto.superclass = superclass; // classname is set only if a name was actually specified. if (classname) proto.classname = classname; // Verify that our prototype provides all of the methods it is supposed to. for(var i = 0; i < provides.length; i++) { // for each class var c = provides[i]; for(var p in c.prototype) { // for each property if (typeof c.prototype[p] != "function") continue; // methods only if (p == "constructor" || p == "superclass") continue; // Check that we have a method with the same name and that // it has the same number of declared arguments. If so, move on if (p in proto && typeof proto[p] == "function" && proto[p].length == c.prototype[p].length) continue; // Otherwise, throw an exception throw new Error("Class " + classname + " does not provide method "+ c.classname + "." + p); } } // Associate the prototype object with the constructor function constructor.prototype = proto; // Copy static properties to the constructor for(var p in statics) constructor[p] = data.statics[p]; // Finally, return the constructor function return constructor; }
演示一下这东西怎么用:
// A Comparable class with an abstract method // so that we can define classes that "provide" Comparable. var Comparable = defineClass({ name: "Comparable", methods: { compareTo: function(that) { throw "abstract"; } } }); // A mixin class with a usefully generic equals( ) method for borrowing var GenericEquals = defineClass({ name: "GenericEquals", methods: { equals: function(that) { if (this == that) return true; var propsInThat = 0; for(var name in that) { propsInThat++; if (this[name] !== that[name]) return false; } // Now make sure that this object doesn't have additional props var propsInThis = 0; for(name in this) propsInThis++; // If this has additional properties, then they are not equal if (propsInThis != propsInThat) return false; // The two objects appear to be equal. return true; } } }); // A very simple Rectangle class that provides Comparable var Rectangle = defineClass({ name: "Rectangle", construct: function(w,h) { this.width = w; this.height = h; }, methods: { area: function( ) { return this.width * this.height; }, compareTo: function(that) { return this.area( ) - that.area( ); } }, provides: Comparable }); // A subclass of Rectangle that chains to its superclass constructor, // inherits methods from its superclass, defines an instance method and // a static method of its own, and borrows an equals( ) method. var PositionedRectangle = defineClass({ name: "PositionedRectangle", extend: Rectangle, construct: function(x,y,w,h) { this.superclass(w,h); // chain to superclass this.x = x; this.y = y; }, methods: { isInside: function(x,y) { return x > this.x && x < this.x+this.width && y > this.y && y < this.y+this.height; } }, statics: { comparator: function(a,b) { return a.compareTo(b); } }, borrows: [GenericEquals] });
发表评论
-
WebApp在移动端的涅盘- 另类的移动端应用程序开发
2010-09-27 22:35 4481同时欢迎到我的BLOG讨 ... -
ScriptDoc的Notation规则
2010-01-23 19:37 1759这个还是蛮重要的,以前就一直很羡慕Java有一套标准来着: 转 ... -
关于google.setOnLoadCallback()的一点研究
2010-01-12 10:01 6118google.setOnLoadCallback()是goog ... -
ECMA 推出 JavaScript 5
2009-12-28 21:17 1613转发自http://www.comsharp.co ... -
Javascript 事件编程 (二)
2009-09-18 21:28 1600Event Handlers and the this Key ... -
Javascript 事件编程 (一)
2009-09-04 15:27 1236Events and Event Handling 事件和事件 ... -
Javascript CSS编程 (一)元素定位、透明、内联样式
2009-09-03 14:29 2046Querying Element Position and S ... -
Javascript CSS编程 (二)Computed Styles、Class修改、操作样式表
2009-09-03 13:15 5308Scripting Computed Styles 计算样式 ... -
Javascript DHTML动画
2009-09-03 13:00 1201JS实现的动画效果多半 ... -
Javascript IE4 DOM
2009-09-02 17:14 997很多IE独有的DOM特性是沿袭自IE4的,所以有必要看看IE4 ... -
Javascript 操控选择文本
2009-09-02 17:02 1242Querying Selected Text 查询选择的文本 ... -
Javascript 寻找文档元素
2009-09-02 16:51 2287Finding Elements in a Document ... -
Javascript 窗口的几何关系和相关方法、属性
2009-09-02 10:47 1109Window Geometry 窗口几何关系 引用Scree ... -
JavaScript window下面的常用函数、属性
2009-09-02 10:30 1139我们常用的一些函数都是全局对象window下面的。这里将其梳理 ... -
JavaScript 在浏览器中的相关概念:执行环境、引入脚本、安全策略等
2009-09-02 09:32 1358The Window as Global Execution ... -
JavaScript Namespace模拟
2009-07-15 18:53 1541做JavaScript的大型项目比较痛苦,它没有namespa ... -
JavaScript 判定对象类型
2009-07-15 16:53 1345判定JS的对象类型基本 ... -
JavaScript Class模拟深入 - 继承、子类
2009-07-15 16:27 1696Superclasses and Subclasses ... -
javascript this 关键字小提示
2009-07-14 22:01 1159来自:http://www.macji.com/2009/01 ... -
JavaScript Class模拟基础
2009-07-14 16:39 1103Simulating Classes in JavaScrip ...
相关推荐
传奇鸭 ... 您只应通过duck.selector或duck.selectors访问存储。 单鸭 import { Duck } from "saga-duck" ; import { takeEvery , call , put , select } from "redux-saga/effects" ; import { delay }
DuckDuckGo Android Welcome to our android application. We are excited to engage the community in development, see CONTRIBUTING.md. We are hiring! Are you a talented cross-platform mobile developer? We...
MacOS 将云存储挂载为本地磁盘Mountain_Duck_4.10.3
带有全功能调试工具的自定义元素,具有惊人的性能。 演示 安装 使用安装组件: $ bower install rubber-duck-debugger --save 或 。 用法 导入 Web Components 的 polyfill: < script src =" bower_...
Redux-Duck-immer 受启发。 提供redux帮助器以实现建议。 减速器的状态由产生,以实现不变性。安装yarn add redux-duck-immer原料药定义动作类型import { defineType } from 'redux-duck-immer' ;/** * type Action...
这是有关设计模式中,对抽象工厂模式的简单应用.用C#写的.
querygate-duckduckgo
https-duckduckgo.com- 鸭鸭去
community-platform, DuckDuckGo社区平台 DuckDuckGo --社区平台这是 duck.co DuckDuckGo社区平台的源代码。要求/安装DuckDuckGo社区平台构建在 Perl Catalyst Catalyst DBIx::Class,Text::Xslat
:duck: 鸭跑 :duck: 发电机功能运行器 用法 function * foo ( ) { yield ( cb ) => setTimeout ( cb , 1000 ) console . log ( 'done cb' ) } const run = require ( 'run-duck-run' ) run ( foo , ( err ) =...
红鸭子 Helper函数使用建议创建Redux模块。 安装 yarn add redux-duck 原料药 创建鸭子 ... 如果未定义应用程序或模块名称,则结果应为字符串,例如application-name/duck-name/ACTION_TYPE或duck-
docker-duck-dns
zsh-duckduckgo 在您的 z-shell 中从 DuckDuckGo 获得非常简单的响应常问问题为什么? 因为。
CAN-Duck:基于CAN的分布式微控制器通讯协议小黄鸭-基于CAN总线的分布式微控制器通信协议栈作者:sdong 2021-03-141.初步接触CAN-Duck1.1初步需求硬件:要运行网络收发测试,你需要一个USB转串口线,连接TX,RX...
Ampare DuckDuckGo Javascript API是一个简单的Javascript字符串框架,可在DuckDuckGo Public API上找到即时答案及更多内容。 Javascript库提供易于访问的功能,可为专业人士和初学者节省时间
使用此库,您可以创建可重复使用和可扩展的鸭子。 定义类型 定义常数 创建可重复使用的鸭子 延长鸭子 创建可重复使用的Duck扩展 使用选择器创建鸭子 基本用法 // widgetsDuck.js import Duck from 'extensible-...
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。 这个概念的名字来源于由James ...
概述这是一个chrome扩展程序,用于显示组件信息,包括操作风险,漏洞,使用的Black Duck Hub项目和违反Black Duck Hub的政策,以帮助确定是否应在项目中使用组件。建造生产: npm run build 发展: npm run dev-...
DuckDuckGo主页的可怕CSS和HTML表示(不带任何JS元素)。 可是努力变得更好。