写 Javascript 程序的时候, 可能会经常把一个对象的属性复制到另一个对象中, Dojo 定义了一些简化这些操作
1. 混合对象
dojo.mixin(destinationObj, srcObj1, srcObj2, ...)
这种复制是通过赋值操作来完成的( = ), 因此对于数字, 布尔, 字符串基本数据类型是按值复制, 其它类型则是按引用复制.
如果 srcObj 中的属性名与 destinationObj 中的属性名重复, 则 srcObj 中属性的值会覆盖 destinationObj 对应的属性值,
如果多个srcObj 中有相同的一个属性, 其值取最右边的 srcObj.prop 的值.
例1:
var destinationObj = {
name: "javascript"
};
dojo.mixin(destinationObj, {name: "dojo"});
console.log(destinationObj.name); // Output: dojo
dojo.mixin(destinationObj, {name: "dojo"}, {name: "dojo 1.7"});
console.log(destinationObj.name); // Output: dojo 1.7
function SrcObj() {} // constructor
var protoObj = {
name: "prototype's prop"
};
SrcObj.prototype = protoObj;
var destinationObj = {
name: "javascript"
};
dojo.mixin(destinationObj, new SrcObj());
console.log(destinationObj.name); // Output: prototype's prop
可以看到把 SrcObj.prototype.name 混合到 destinationObj 中, 并覆盖了 name
2. 复制对象
上面的方法只有 数字, 布尔, 字符串这种基本数据类型是按值复制的, 其它类型都复制的引用, 如果想要把所有类型都按值复制, 就要用到下面的方法.
dojo.clone( srcObj )
例:
var kingdomsOfDiscovery = {
city: "Dalian",
country: "China"
};
var attraction = {
name: "Dalian Discoveryland Theme Park",
location: kingdomsOfDiscovery
};
var testClone = dojo.clone(attraction);
不是像 dojo.mixin 方法一样, 只是复制了对 kingdomsOfDiscovery 引用, 而是完全新创建了一个一模一样的对象.