您的位置:首页 > 其它

dojo 中对象扩展与原型继承的实现

2010-09-17 00:12 597 查看
dojo 是一款优秀的javascript框架,通常我们可以在复杂的企业级应用中看到它的身影。

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: