1. var num = 10;
    2. var obj = {num: 20};
    3. obj.fn = (function (num) {
    4. this.num = num * 3;
    5. num++;
    6. return function (n) {
    7. this.num += n;
    8. num++;
    9. console.log(num);
    10. }
    11. })(obj.num);
    12. var fn = obj.fn;
    13. fn(5);
    14. obj.fn(10);
    15. console.log(num, obj.num);
    16. function Fn() {
    17. this.x = 100;
    18. this.y = 200;
    19. this.getX = function () {
    20. console.log(this.x);
    21. }
    22. }
    23. Fn.prototype = {
    24. y: 400,
    25. getX: function () {
    26. console.log(this.x);
    27. },
    28. getY: function () {
    29. console.log(this.y);
    30. },
    31. sum: function () {
    32. console.log(this.x + this.y);
    33. }
    34. };
    35. var f1 = new Fn;
    36. var f2 = new Fn;
    37. console.log(f1.getX === f2.getX);
    38. console.log(f1.getY === f2.getY);
    39. console.log(f1.__proto__.getY === Fn.prototype.getY);
    40. console.log(f1.__proto__.getX === f2.getX);
    41. console.log(f1.getX === Fn.prototype.getX);
    42. console.log(f1.constructor);
    43. console.log(Fn.prototype.__proto__.constructor);
    44. f1.getX();//=>this:f1 f1.x=>100
    45. f1.__proto__.getX();//=>this:f1.__proto__(Fn.prototype) Fn.prototype.x=>undefined
    46. f2.getY();//=>this:f2 f2.y=>200
    47. Fn.prototype.getY();//=>this:Fn.prototype Fn.prototype.y=>400
    48. f1.sum();//=>this:f1 f1.x+f1.y=>300
    49. Fn.prototype.sum();//=>this:Fn.prototype Fn.prototype.x+Fn.prototype.y=>undefined+400=>NaN
    50. function fun() {
    51. this.a = 0;
    52. this.b = function () {
    53. alert(this.a);
    54. }
    55. }
    56. fun.prototype = {
    57. b: function () {
    58. this.a = 20;
    59. alert(this.a);
    60. },
    61. c: function () {
    62. this.a = 30;
    63. alert(this.a)
    64. }
    65. };
    66. var my_fun = new fun();
    67. // my_fun.b();//=>私有的方法B this:my_fun my_fun.a =>'0'
    68. // my_fun.c();//=>公有的方法C this:my_fun my_fun.a=30(把当前实例私有属性A修改为30) =>'30'
    69. var my_fun2 = new fun;
    70. console.log(my_fun2.a);
    71. my_fun2.__proto__.c();//=>this:my_fun2.__proto__ my_fun2.__proto__.a=30(当前实例通过原型链在类的公有属性上增加了一个a:30)
    72. console.log(my_fun2.a);
    73. console.log(my_fun.__proto__.a);
    74. function Foo() {
    75. getName = function () {
    76. console.log(1);
    77. };
    78. return this;
    79. }
    80. Foo.getName = function () {
    81. console.log(2);
    82. };
    83. Foo.prototype.getName = function () {
    84. console.log(3);
    85. };
    86. var getName = function () {
    87. console.log(4);
    88. };
    89. function getName() {
    90. console.log(5);
    91. }
    92. Foo.getName();//=>2 把FOO作为对象,找其私有属性
    93. getName();//=>4 执行全局下的GET-NAME
    94. Foo().getName();//=>1 先把FOO作为普通函数执行,把执行的结果调取GET-NAME在执行
    95. getName();//=>1
    96. new Foo.getName();//=>先获取Foo.getName的值(假设B),然后再new B()相当于创建B的实例 =>2 (new Foo.getName;一样的)
    97. new Foo().getName();//=>new Foo()获取实例,把得到的实例在调取GET-NAME =>3
    98. new new Foo().getName();
    99. //=>var f=new Foo()
    100. //=>new f.getName(); =>new (f.getName)(); =>3
    101. //obj.getX();//=>先获取obj的getX的属性值,然后把获取的值执行
    102. // Function.prototype.call = function call(context) {
    103. // //=>call方法中的this:fn call
    104. //
    105. // //[native code]
    106. // //1、把指定函数中的THIS指向CONTEXT [把THIS中的THIS关键字指向CONTEXT]
    107. // //2、把指定函数执行 [把THIS执行]
    108. // this();
    109. //
    110. // };
    111. // //=>以下都是让CALL方法执行
    112. // // fn.call(opp);
    113. // // fn.__proto__.call()
    114. // // Function.prototype.call();
    115. function fn1() {
    116. console.log(1);
    117. }
    118. function fn2() {
    119. console.log(2);
    120. }
    121. fn1.call(fn2);
    122. /*
    123. * fn1.call:fn1这个Function的实例通过__proto__找到Function.prototype上的call方法,然后让call方法执行(传递fn2这个实参)
    124. *
    125. * 执行CALL的时候,CALL中的THIS:FN1,所以此处是把FN1执行,让FN1中的THIS指向FN2(只不过我们的FN1中不需要使用THIS) =>1
    126. */
    127. fn1.call.call.call(fn2);
    128. /*
    129. * fn1.call.call.call:依然是找到原型上的CALL方法,并且让CALL执行
    130. * CALL中的THIS:fn1.call.call[原型上的CALL]
    131. * CALL中的CONTEXT:FN2
    132. *
    133. * 让 [原型上的CALL(FN1.CALL.CALL)] 中的THIS指向 FN2
    134. * 让 [原型上的CALL(FN1.CALL.CALL)] 执行
    135. * 第二次执行原型上的CALL,只不过此时CALL中的THIS是FN2
    136. * 让FN2中的THIS指向UNDEFINED
    137. * 让FN2执行
    138. * =>2
    139. */
    140. Function.prototype.call(fn2);
    141. /*
    142. * 找到原型上的CALL方法,让CALL方法执行
    143. * CALL执行:
    144. * =>THIS:Function.prototype
    145. * =>CONTEXT:fn2
    146. *
    147. * 把Function.prototype中的THIS关键字变为fn2
    148. * 让Function.prototype执行
    149. *
    150. * =>无输出
    151. */
    152. Function.prototype.call.call.call(fn2);
    153. /*
    154. * 等价于fn1.call.call.call(fn2)
    155. */