有效的对象拷贝应该是指深拷贝。
浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变!
深拷贝:就是重新复制一块内存,这样就不会互相影响。
有些时候我们定义一个数组,把这个数据赋值给跟多对象数组中的一个字段,当我们改变对象数组中的该字段的时候,我们会把原来的数组也改变了,这样就会引起其他数组对象中的对应的字段改变,这不是我们想要的。
这个时候我们会用到深拷贝。
深拷贝的方法:
var deepCopy = function(source)
{
var result;
(source instanceof Array) ? (result = []) : (result = {});
for (var key in source) {
result[key] = (typeof source[key]==='object') ? deepCopy(source[key]) : source[key];
}
return result;
}
||Object.prototype.clone = function() {
// Handle null or undefined or function
if (null == this || "object" != typeof this)
return this;
// Handle the 3 simple types, Number and String and Boolean
if(this instanceof Number || this instanceof String || this instanceof Boolean)
return this.valueOf();
// Handle Date
if (this instanceof Date) {
var copy = new Date();
copy.setTime(this.getTime());
return copy;
}
// Handle Array or Object
if (this instanceof Object || this instanceof Array) {
var copy = (this instanceof Array)?[]:{};
for (var attr in this) {
if (this.hasOwnProperty(attr))
copy[attr] = this[attr]?this[attr].clone():this[attr];
}
return copy;
}
throw new Error("Unable to clone obj! Its type isn't supported.");
}
function a() {
alert("aaaaa");
}
var b = a.clone();
b();
alert(b === a);
||Object.prototype.clone = function() { // Handle null or undefined or function if (null == this || "object" != typeof this) return this; // Handle the 3 simple types, Number and String and Boolean if(this instanceof Number || this instanceof String || this instanceof Boolean) return this.valueOf(); // Handle Date if (this instanceof Date) { var copy = new Date(); copy.setTime(this.getTime()); return copy; } // Handle Array or Object if (this instanceof Object || this instanceof Array) { var copy = (this instanceof Array)?[]:{}; for (var attr in this) { if (this.hasOwnProperty(attr)) copy[attr] = this[attr]?this[attr].clone():this[attr]; } return copy; } throw new Error("Unable to clone obj! Its type isn't supported.");}function a() { alert("aaaaa");}var b = a.clone();b();alert(b === a);。
要实现深复制有很多办法,比如最简单的办法有:var cloneObj = JSON.parse(JSON.stringify(obj)); 上面这种方法好处是非常简单易用,但是坏处也显而易见,这会抛弃对象的constructor,也就是深复制之后,无论这个对象原本的构造函数是什么,在深复制之后都会变成Object。
另外诸如RegExp对象是无法通过这种方式深复制的。所以这里我将介绍一种,我自认为很优美的深复制方法,当然可能也存在问题。
如果你发现了我的实现方法有什么问题,请及时让我知道~ 先决条件:1. 对于任何对象,它可能的类型有Boolean, Number, Date, String, RegExp, Array 以及 Object(所有自定义的对象全都继承于Object)2. 我们必须保留对象的构造函数信息(从而使新对象可以使用定义在prototype上的函数) 最重要的一个函数:Object.prototype.clone = function () { var Constructor = this.constructor; var obj = new Constructor(); for (var attr in this) { if (this.hasOwnProperty(attr)) { if (typeof(this[attr]) !== "function") { if (this[attr] === null) { obj[attr] = null; } else { obj[attr] = this[attr].clone(); } } } } return obj; }; 定义在Object.prototype上的clone()函数是整个方法的核心,对于任意一个非js预定义的对象,都会调用这个函数。而对于所有js预定义的对象,如Number,Array等,我们就要实现一个辅助clone()函数来实现完整的克隆过程:/* Method of Array*/ Array.prototype.clone = function () { var thisArr = this.valueOf(); var newArr = []; for (var i=0; i<thisArr.length; i++) { newArr.push(thisArr[i].clone()); } return newArr; };/* Method of Boolean, Number, String*/ Boolean.prototype.clone = function() { return this.valueOf(); }; Number.prototype.clone = function() { return this.valueOf(); }; String.prototype.clone = function() { return this.valueOf(); };/* Method of Date*/ Date.prototype.clone = function() { return new Date(this.valueOf()); };/* Method of RegExp*/ RegExp.prototype.clone = function() { var pattern = this.valueOf(); var flags = ''; flags += pattern.global ? 'g' : ''; flags += pattern.ignoreCase ? 'i' : ''; flags += pattern.multiline ? 'm' : ''; return new RegExp(pattern.source, flags); }; 可能直接定义在预定义对象的方法上,让人感觉会有些问题。
但在我看来这是一种优美的实现方式。同时我也在开发一个插件,主要的思想也就是扩展预定义对象的方法。
这个插件叫JustJS(Github项目地址) 有以下一些特性:1. 同时支持Web前端和node.js使用。2. 直接对预定义对象的方法进行扩展3. 使用 J(function(){。
}) 语句块,决不污染全局命名空间。目前只写了一小部分,同时也写了些简单的文档,有兴趣的同学可以看一下,也可以加入我,Fork我的项目,喜欢的同学还可以给Star!。
这题的意思是把一个对象中的内容一级一级的复制到另外一个对象中。用for(var i in obj)的方式就可以了。
至于类型,js虽然是弱类型,但其实是有类型的,如数字类型,就是Number,对象类型就是Object,String,Date,Array,Boolean,Function等,然要判断对象的类型也很简单,如:
var a = 2;
a.constructor == Number;// 判断是否为数值
a.constructor == String;// 判断是否为字符串 a = "test"
a.constructor == Date;// 判断是否为日期 a = new Date()
a.constructor == Array;// 判断是否为数组 a = [1,"2",true]
a.constructor == Boolean;// 判断是否为布尔型 a = true
a.constructor == Object;// 判断是否为对象 a = {}
a.constructor == Function;// 判断是否为方法类型 a = function(){}
拷贝可以使用:对象.createTextRange().execCommand("copy")命令,你可以用:window.clipboardData.setData("text",内容的来源)这里内容的来源例如要取得文本框ID为y里的文本复制到剪切板,这里写y.value粘贴其实就是目标对象的value属性=y.value剪切是以选择为基础的,先必须建立选择区域,如有个文本框ID为a,要剪切里面的文本需要:a.createTextRange().execCommand("cut")来完成剪切。
全选,如有个文本框ID为b,则全选的话只需b.select()即可。
JavaScript中要实现继承,其实就是实现三层含义:1、子类的实例可以共享父类的方法;2、子类可以覆盖父类的方法或者扩展新的方法;3、子类和父类都是子类实例的“类型”。
JavaScript中,并不直接从语法上支持继承,但是可以通过模拟的方法来实现继承,以下是关于实现继承的几种方法的总结:1、构造继承法2、原型继承法3、实例继承法4、拷贝继承法1、构造继承法:在子类中执行父类的构造函数。 12、原型继承法:JavaScript是一种基于原型的语言。
要了解什么是“原型继承法”,先了解一下prototype的特性:prototype的最大特性是能够让对象实例共享原型对象的属性,因此如果把某个对象作为一个类型的原型,那么我们说这个类型的所有实例都一这个对象为原型。这个时候,实际上这个对象的类型也可以作为那些以这个对象为原型的实例的类型。
假如:Point类的对象作为Point2D类型的原型(Point2D.prototype = new Point(2)),那么说Point2D的所有实例都是以Point类的对象为原型。此时,实际上Point类就可以作为Point2D类型的对象的类型(相当于Point2D类型“继承”了Point类型)。
见例:1 <script LANGUAGE="JavaScript"> 2 方法,可以被继承14 {15 return this.dimension*2;16 }1718 function Point2D(x,y) //定义一个Point2D类19 {20 this.x = x;21 this.y = y;22 }2324 Point2D.prototype = new Point(2); //运行“原型继承法”使Point2D继承Point2526 function Point3D(x,y,z) //定义Point3D类27 {28 this.x = x;29 this.y = y;30 this.z = z;31 }3233 Point3D.prototype = new Point(3); //Point3D继承Point类3435 var p2 = new Point2D(1,2); //构造一个Point2D对象3637 var p3 = new Point3D(1,2,3); //构造一个Point3D对象3839 dwn(p2.dimension); //240 dwn(p3.dimension); //341 dwn(p2.distance()); //4 可以继承静态方法42 dwn(p3.distance()); //6 可以继承静态方法<。
可以利用JS中的for in语法进行处理,具体如下:
//要复制的原对象
var destobj={ colkey: "col", colsinfo: "NameList" }
//复制的目标对象
var myobj=new Object();
for(var om in myobj)
{
var name=om;//属性名称
var value=destobj[om];//属性对应的值
myobj[name]=destobj[om];
}
如果是使用了 JQ EXTJS 的话本身就有 对象克隆的 函数库可以使用 如 extjs 使用
ext.ux.util.clone()
没有用这些的话 可以自己写一个 克隆函数 网上有资源 比如
function deepClone(obj){ var result={},oClass=isClass(obj);
// if(oClass==="Object"){
// result={};
// }else if(oClass==="Array"){
// result=[];
// }else{
// return obj;
// }
for(key in obj){
var copy=obj[key];
if(isClass(copy)=="Object"){
result[key]=arguments.callee(copy);
}else if(isClass(copy)=="Array"){
result[key]=arguments.callee(copy);
}else{
result[key]=obj[key];
}
}
return result;
}
function isClass(o){
if(o===null) return "Null";
if(o===undefined) return "Undefined";
return Object.prototype.toString.call(o).slice(8,-1);
}或者参考 extjs 的方法
function(o) {
if(!o || 'object' !== typeof o) { return o; }
if('function' === typeof o.clone) { return o.clone(); }
var c = '[object array]' === object.prototype.tostring.call(o) ? [] : {};
var p, v;
for(p in o) {
if(o.hasownproperty(p)) { v = o[p];
if(v && 'object' === typeof v) {
c[p] = ext.ux.util.clone(v);
} else {
c[p] = v;
}
}
}
return c;};
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:4.046秒