- var num = 10;
- var obj = {num: 20};
- obj.fn = (function (num) {
-     this.num = num * 3;
-     num++;
-     return function (n) {
-         this.num += n;
-         num++;
-         console.log(num);
-     }
- })(obj.num);
- var fn = obj.fn;
- fn(5);
- obj.fn(10);
- console.log(num, obj.num);
- function Fn() {
-     this.x = 100;
-     this.y = 200;
-     this.getX = function () {
-         console.log(this.x);
-     }
- }
- Fn.prototype = {
-     y: 400,
-     getX: function () {
-         console.log(this.x);
-     },
-     getY: function () {
-         console.log(this.y);
-     },
-     sum: function () {
-         console.log(this.x + this.y);
-     }
- };
- var f1 = new Fn;
- var f2 = new Fn;
- console.log(f1.getX === f2.getX);
- console.log(f1.getY === f2.getY);
- console.log(f1.__proto__.getY === Fn.prototype.getY);
- console.log(f1.__proto__.getX === f2.getX);
- console.log(f1.getX === Fn.prototype.getX);
- console.log(f1.constructor);
- console.log(Fn.prototype.__proto__.constructor);
- f1.getX();//=>this:f1  f1.x=>100
- f1.__proto__.getX();//=>this:f1.__proto__(Fn.prototype)  Fn.prototype.x=>undefined
- f2.getY();//=>this:f2  f2.y=>200
- Fn.prototype.getY();//=>this:Fn.prototype  Fn.prototype.y=>400
- f1.sum();//=>this:f1  f1.x+f1.y=>300
- Fn.prototype.sum();//=>this:Fn.prototype  Fn.prototype.x+Fn.prototype.y=>undefined+400=>NaN
- function fun() {
-     this.a = 0;
-     this.b = function () {
-         alert(this.a);
-     }
- }
- fun.prototype = {
-     b: function () {
-         this.a = 20;
-         alert(this.a);
-     },
-     c: function () {
-         this.a = 30;
-         alert(this.a)
-     }
- };
- var my_fun = new fun();
- // my_fun.b();//=>私有的方法B  this:my_fun  my_fun.a =>'0'
- // my_fun.c();//=>公有的方法C  this:my_fun  my_fun.a=30(把当前实例私有属性A修改为30) =>'30'
- var my_fun2 = new fun;
- console.log(my_fun2.a);
- my_fun2.__proto__.c();//=>this:my_fun2.__proto__   my_fun2.__proto__.a=30(当前实例通过原型链在类的公有属性上增加了一个a:30)
- console.log(my_fun2.a);
- console.log(my_fun.__proto__.a);
- function Foo() {
-     getName = function () {
-         console.log(1);
-     };
-     return this;
- }
- Foo.getName = function () {
-     console.log(2);
- };
- Foo.prototype.getName = function () {
-     console.log(3);
- };
- var getName = function () {
-     console.log(4);
- };
- function getName() {
-     console.log(5);
- }
- Foo.getName();//=>2 把FOO作为对象,找其私有属性
- getName();//=>4 执行全局下的GET-NAME
- Foo().getName();//=>1 先把FOO作为普通函数执行,把执行的结果调取GET-NAME在执行
- getName();//=>1
- new Foo.getName();//=>先获取Foo.getName的值(假设B),然后再new B()相当于创建B的实例 =>2  (new Foo.getName;一样的)
- new Foo().getName();//=>new Foo()获取实例,把得到的实例在调取GET-NAME  =>3
- new new Foo().getName();
- //=>var f=new Foo()
- //=>new f.getName();  =>new (f.getName)(); =>3
- //obj.getX();//=>先获取obj的getX的属性值,然后把获取的值执行
- // Function.prototype.call = function call(context) {
- //     //=>call方法中的this:fn  call
- //
- //     //[native code]
- //     //1、把指定函数中的THIS指向CONTEXT [把THIS中的THIS关键字指向CONTEXT]
- //     //2、把指定函数执行 [把THIS执行]
- //     this();
- //
- // };
- // //=>以下都是让CALL方法执行
- // // fn.call(opp);
- // // fn.__proto__.call()
- // // Function.prototype.call();
- function fn1() {
-     console.log(1);
- }
- function fn2() {
-     console.log(2);
- }
- fn1.call(fn2);
- /*
-  * fn1.call:fn1这个Function的实例通过__proto__找到Function.prototype上的call方法,然后让call方法执行(传递fn2这个实参)
-  *
-  * 执行CALL的时候,CALL中的THIS:FN1,所以此处是把FN1执行,让FN1中的THIS指向FN2(只不过我们的FN1中不需要使用THIS) =>1
-  */
- fn1.call.call.call(fn2);
- /*
-  * fn1.call.call.call:依然是找到原型上的CALL方法,并且让CALL执行
-  *   CALL中的THIS:fn1.call.call[原型上的CALL]
-  *   CALL中的CONTEXT:FN2
-  *
-  *   让 [原型上的CALL(FN1.CALL.CALL)] 中的THIS指向 FN2
-  *   让 [原型上的CALL(FN1.CALL.CALL)] 执行
-  *      第二次执行原型上的CALL,只不过此时CALL中的THIS是FN2
-  *          让FN2中的THIS指向UNDEFINED
-  *          让FN2执行
-  * =>2
-  */
- Function.prototype.call(fn2);
- /*
-  * 找到原型上的CALL方法,让CALL方法执行
-  *   CALL执行:
-  *   =>THIS:Function.prototype
-  *   =>CONTEXT:fn2
-  *
-  *   把Function.prototype中的THIS关键字变为fn2
-  *   让Function.prototype执行
-  *
-  * =>无输出
-  */
- Function.prototype.call.call.call(fn2);
- /*
-  * 等价于fn1.call.call.call(fn2)
-  */