| 学习时间 |
完成时间 ✅ |
重难点 |
疑问/遗漏 |
|
|
|
|
| 复习时间 |
|
|
|
|
|
|
对象克隆、浅拷贝
var person1={ name:'张三', age:18, father: { first: 'anmi' }}var person2=person1;person2.name='李四'此时person1的数据也被改变了var person2={};浅拷贝,因为当对象里还有对象,则就改变person2仍然会改变person1for(var key in person1){ if(person1.hasOwnProperty(key)){ person2[key]=person1[key] }}person2.father.second='cc'此时再改变person2就不会再改变person1了,但是改变person2.father的内容person1也会跟着改变
深拷贝
方法一 function deepClone(origin,target){ var target=target||{}, toStr=Object.prototype.toString; arrType='[object Array]'; for(var key in origin){ if(origin.hasOwnProperty(key)){ if(typeof(origin[key])==='object'&&origin[key]!==null){ if(toStr.call(origin[key])===arrType){ target[key]=[]; }else{ target[key]={} } deepClone(origin[key],target[key]) }else{ target[key]=origin[key] } } } return target; }方法二JSON.stringify()JSON.parse()
习题
var name='222';var a={ name:'111', say:function(){ console.log(this.name) }}var fun =a.say;fun(); //'222'a.say(); //'111'var b={ name:'333', say: function(fun){ fun(); }}b.say(a.say);//'222'b.say=a.say;b.say()//'333'function test(){ var marty={ name:'marty', printName: function(){ console.log(this.name) } } var test1={name:'test1'} var test2={name:'test2'} var test3={name:'test3'} test3.printName=marty.printName; marty.printName.call(test1);//test1 marty.printName.apply(test2);//test2 marty.printName();//marty test3.printName();//test3}var bar={a:'1'}function test(){ bar.a='a'; Object.prototype.b='b' return function inner(){ console.log(bar.a) //a console.log(bar.b) //b }}test()();/**************************/function Foo(){ getName=function(){ console.log(1); } return this;}Foo.getName=function(){ //此处的Foo并没有执行,只是相当于往对象Foo添加一个属性 console.log(2)}Foo.prototype.getName=function(){ console.log(3)}var getName=function(){ console.log(4)}function getName(){ console.log(5)}Foo.getName(); //2getName(); //4//预编译GO//1.变量声明//2.函数声明//3.运行->赋值Foo().getName(); //1getName(); //1new Foo.getName();//2 此处先执行Foo.getName() 为2 new 2还是2new Foo().getName();//3 此处先执行new Foo()new new Foo().getName();//3