dojo 中对象扩展与原型继承的实现
2010-09-17 00:12
597 查看
dojo 是一款优秀的javascript框架,通常我们可以在复杂的企业级应用中看到它的身影。
dojo 提供了两个方法来实现继承 dojo.mixin
、dojo.extend
dojo.mixin 作用在对象上,它负责扩展一个对象
dojo.extend 作用在实例上,他负责扩展实例(本质上是扩展产生实例的类)
而这两个方法的底层实现是dojo._mixin。
因此,我将这一部分抽出,并进行分析。
来源:http://www.zhangjingwei.com/archives/dojo-prototypal-inheritance/
dojo 提供了两个方法来实现继承 dojo.mixin
、dojo.extend
dojo.mixin 作用在对象上,它负责扩展一个对象
dojo.extend 作用在实例上,他负责扩展实例(本质上是扩展产生实例的类)
而这两个方法的底层实现是dojo._mixin。
因此,我将这一部分抽出,并进行分析。
(function(){ // 创建一个命名空间 var dojo = {}; // 初始化一些变量 var extraNames, extraLen, empty = {}; // 判断是否为ie浏览器,如果不是则将 dojo._extraNames 设为空数组 // 如果是则将其设置为["hasOwnProperty", "valueOf", "isPrototypeOf", // "propertyIsEnumerable", "toLocaleString", "toString", "constructor"] for(var i in {toString: 1}){ extraNames = []; break; } dojo._extraNames = extraNames = extraNames || ["hasOwnProperty", "valueOf", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "constructor"]; extraLen = extraNames.length; dojo._mixin = function(/*Object*/ target, /*Object*/ source){ var name, s, i; // 历遍源对象 for(name in source){ // 将源对象中的属性依次赋给s s = source[name]; // 如果目标对象不存在属性name 或者 目标对象中属性name 的值不等于s // 同时这个属性不是js Object 对象的保留属性 if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){ // 更新目标对象 target[name] = s; } } // IE doesn't recognize some custom functions in for..in // 如果是ie浏览器 --> dojo._extraNames 数组不为0 if(extraLen && source){ for(i = 0; i < extraLen; ++i){ // 调用数组中的那些方法 name = extraNames[i]; s = source[name]; // 用 dojo._extraNames 中的方法检查是否可将源对象扩展到目标对象中 if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){ target[name] = s; } } } return target; // Object } dojo.mixin = function(/*Object*/obj, /*Object...*/props){ // 如果目标为空,初始化一个对象 if(!obj){ obj = {}; } // 调用dojo_mixin() 扩展目标对象 for(var i=1, l=arguments.length; i<l; i++){ dojo._mixin(obj, arguments[i]); } return obj; // Object } dojo.extend = function(/*Object*/ constructor, /*Object...*/ props){ for(var i=1, l=arguments.length; i<l; i++){ // 调用dojo_mixin() 扩展构造函数的原型链 dojo._mixin(constructor.prototype, arguments[i]); } return constructor; // Object } window.dojo = dojo; })(); var obj = { age: 24 } // 调用 dojo.mixin 方法扩展obj对象 obj = dojo.mixin(obj,{name:"zhangsan"}); alert(obj.name + "'s age is " + obj.age == "zhangsan's age is 24"); var User = function (){}; var obj = new User(); // 调用 dojo.extend 方法扩展 User 对象的原型链 User = dojo.extend(User,{ saybye: function(){ return "byebye"; } }); // obj 对象具备了saybye()的方法 alert(obj.saybye() == "byebye")
来源:http://www.zhangjingwei.com/archives/dojo-prototypal-inheritance/
相关文章推荐
- javascript 用原型继承来实现对象系统
- javascript模拟实现继承,继承一次父类模板和原型对象
- jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
- js高级——原型对象继承的实现
- JavaScript 利用原型和原型链实现对象继承
- JS:收集的一些Array及String原型对象的扩展实现代码
- 收集的一些Array及String原型对象的扩展实现代码
- 浅谈javascript对象、如何实现继承、jQuery方法的扩展(jquery插件)
- 算法-javascript自实现继承extend(单次继承原型对象和单次继承构造函数)
- 本地对象Array的原型扩展实现代码
- jQuery轮播图(二)利用构造函数和原型创建对象以实现继承
- JavaScript使用原型和原型链实现对象继承的方法详解
- js使用原型实现继承与new一个新对象的方法
- 【JavaScript高级程序设计】读书笔记之二 —— 理解对象的原型、继承
- javascript面向对象实现方法(类的继承与多态)
- QuickCSharp框架开发(15)------定义SqlDbAuthenticationProvider对象、继承IAuthenticationProvider接口、实现Authenticate方
- 收集JavaScript内置对象扩展原型函数1