function ss(){
this.name='ss';
this.test=['a','b','c'];
}
ss.prototype.age='12';
ss.prototype.sayName=function(){
alert(this.name);
}
function subObject(o){
function b(){};
b.prototype=o;
return new b();
}
var cc=subObject(new ss());
var dd=subObject(new ss());
cc.name='I\'m cc';
dd.test.push('d');
for (var key in cc){
console.log(key+':'+cc[key]);
}
for (var key in dd){
console.log(key+':'+dd[key]);
}
var ee=subObject(new Date());
alert(ee instanceof Date); //true 没有继承任何date的方法
這個無法拷貝函數啊
@byvoid 这个我用来做继承用的,比如Child.prototype = $clone(Parent.prototype),函数是可以拷贝过去的.
@sumory 函數不是深拷貝啊,而且成員的 instanceof 不可用了。
@byvoid 你确定没有搞错? 测试下这个:
看下结果,可以解答你的问题了
@sumory 這個實現對於函數類型還是淺拷貝,沒有真正複製一個函數。另外試試拷貝過的Date,instanceof不管用。還有,互相引用的兩個對象會遞歸到棧溢出。
@byvoid 我试了下Date类型的确实不能正确instanceof了;不知道你说的“栈溢出”的场景是?
@byvoid 请问为何要拷贝Date,Date是js中的引用类型,如何去复制,就像你无法去复制Object一样。另你所说的instanceof,请参考我的代码。
@sumory 這個例子,無論複製 obj1 還是 obj2 ,都會棧溢出。
@byvoid 循环是普遍问题吧,应该避免这样的编程方式并加检测机制的,就是不太了解js里应该怎么写
碰到函数时用匿名函数包一层: (function (c, a) { fn,apply(c, a); }(context, arg)) context为你的新上下文,其他的,你懂的
忘记return了,还要包一层。。。和bind一样的
return JSON.parse(JSON.stringify(origin));
这种只适用于Function以外的对象