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=>100f1.__proto__.getX();//=>this:f1.__proto__(Fn.prototype) Fn.prototype.x=>undefinedf2.getY();//=>this:f2 f2.y=>200Fn.prototype.getY();//=>this:Fn.prototype Fn.prototype.y=>400f1.sum();//=>this:f1 f1.x+f1.y=>300Fn.prototype.sum();//=>this:Fn.prototype Fn.prototype.x+Fn.prototype.y=>undefined+400=>NaNfunction 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-NAMEFoo().getName();//=>1 先把FOO作为普通函数执行,把执行的结果调取GET-NAME在执行getName();//=>1new Foo.getName();//=>先获取Foo.getName的值(假设B),然后再new B()相当于创建B的实例 =>2 (new Foo.getName;一样的)new Foo().getName();//=>new Foo()获取实例,把得到的实例在调取GET-NAME =>3new 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) */