学习时间 完成时间 ✅ 重难点 疑问/遗漏
复习时间

对象克隆、浅拷贝

  1. var person1={
  2. name:'张三',
  3. age:18,
  4. father: {
  5. first: 'anmi'
  6. }
  7. }
  8. var person2=person1;
  9. person2.name='李四'
  10. 此时person1的数据也被改变了
  11. var person2={};
  12. 浅拷贝,因为当对象里还有对象,则就改变person2仍然会改变person1
  13. for(var key in person1){
  14. if(person1.hasOwnProperty(key)){
  15. person2[key]=person1[key]
  16. }
  17. }
  18. person2.father.second='cc'
  19. 此时再改变person2就不会再改变person1了,但是改变person2.father的内容person1也会跟着改变

深拷贝

  1. 方法一
  2. function deepClone(origin,target){
  3. var target=target||{},
  4. toStr=Object.prototype.toString;
  5. arrType='[object Array]';
  6. for(var key in origin){
  7. if(origin.hasOwnProperty(key)){
  8. if(typeof(origin[key])==='object'&&origin[key]!==null){
  9. if(toStr.call(origin[key])===arrType){
  10. target[key]=[];
  11. }else{
  12. target[key]={}
  13. }
  14. deepClone(origin[key],target[key])
  15. }else{
  16. target[key]=origin[key]
  17. }
  18. }
  19. }
  20. return target;
  21. }
  22. 方法二
  23. JSON.stringify()
  24. JSON.parse()

习题

  1. var name='222';
  2. var a={
  3. name:'111',
  4. say:function(){
  5. console.log(this.name)
  6. }
  7. }
  8. var fun =a.say;
  9. fun(); //'222'
  10. a.say(); //'111'
  11. var b={
  12. name:'333',
  13. say: function(fun){
  14. fun();
  15. }
  16. }
  17. b.say(a.say);//'222'
  18. b.say=a.say;
  19. b.say()//'333'
  20. function test(){
  21. var marty={
  22. name:'marty',
  23. printName: function(){
  24. console.log(this.name)
  25. }
  26. }
  27. var test1={name:'test1'}
  28. var test2={name:'test2'}
  29. var test3={name:'test3'}
  30. test3.printName=marty.printName;
  31. marty.printName.call(test1);//test1
  32. marty.printName.apply(test2);//test2
  33. marty.printName();//marty
  34. test3.printName();//test3
  35. }
  36. var bar={a:'1'}
  37. function test(){
  38. bar.a='a';
  39. Object.prototype.b='b'
  40. return function inner(){
  41. console.log(bar.a) //a
  42. console.log(bar.b) //b
  43. }
  44. }
  45. test()();
  46. /**************************/
  47. function Foo(){
  48. getName=function(){
  49. console.log(1);
  50. }
  51. return this;
  52. }
  53. Foo.getName=function(){ //此处的Foo并没有执行,只是相当于往对象Foo添加一个属性
  54. console.log(2)
  55. }
  56. Foo.prototype.getName=function(){
  57. console.log(3)
  58. }
  59. var getName=function(){
  60. console.log(4)
  61. }
  62. function getName(){
  63. console.log(5)
  64. }
  65. Foo.getName(); //2
  66. getName(); //4
  67. //预编译GO
  68. //1.变量声明
  69. //2.函数声明
  70. //3.运行->赋值
  71. Foo().getName(); //1
  72. getName(); //1
  73. new Foo.getName();//2 此处先执行Foo.getName() 为2 new 2还是2
  74. new Foo().getName();//3 此处先执行new Foo()
  75. new new Foo().getName();//3