ES6_函数方法
1 //2017/7/15 2 //Javascript 中的方法:在一个对象中绑定函数,称为这个对象的方法。 3 /*1*/ 4 var boy={ 5 name:'xiaoming', 6 birth:2007, 7 age:function(){ 8 var y=new Date().getFullYear(); 9 return y-this.birth;//注意这里的this,在这个方法内部,this始终指向当前对象,也就是boy这个对象,this.birth可以取到boy对象里的birth的值。 10 } 11 }; 12 13 console.log(boy.age);//打印出整个函数 14 console.log(boy.age());//10 15 16 /*2*/ 17 function getAge(){ 18 var y=new Date().getFullYear(); 19 return y-this.birth; 20 } 21 22 var boy={ 23 name:'xiaoming', 24 birth:2007, 25 age:getAge 26 } 27 28 console.log(boy.age());//10 29 console.log(getAge());//NaN。注意:这里单独调用getAge()函数,该函数的this指向全局对象,也就是window。 30 31 /*3*/ 32 var fn=boy.age;//不能先拿到boy的age函数,要保证this指向正确,必须用obj.xxx()的形式调用。 33 console.log(fn());//NaN。 34 35 36 /*4*/ 37 //this的指向是个大问题,ECMA决定,在strict模式下让函数的this指向undefined,因此,在strict模式下,我们会得到一个错误,这只是让错误暴露出来,并没有解决this应该指向的正确位置。 38 39 "use strict"; 40 var xiaoming={ 41 name:"xiaoming", 42 birth:2007, 43 age:function(){ 44 var y=new Date().getFullYear(); 45 return y-this.birth; 46 } 47 }; 48 49 var fn=xiaoming.age; 50 fn();//Uncaught TypeError: Cannot read property 'birth' of undefined 51 52 /*5*/ 53 "use strict"; 54 var xiaoming={ 55 name:"xiaoming", 56 birth:2007, 57 age:function(){ 58 function getAge(){ 59 var y=new Date().getFullYear(); 60 return y-this.birth; 61 } 62 return getAge(); 63 } 64 }; 65 xiaoming.age();//es6.html:426 Uncaught TypeError: Cannot read property 'birth' of undefined 66 console.log(xiaoming.age());//在非strict模式下:NaN 67 68 //这是因为this指针只在age方法的函数内指向xiaoming,在函数内部定义的函数又指向undefined(在非strict模式下,它重新指向全局对象window!)。 69 70 /*6*/ 71 //修复方法:用一个that变量首先捕获this。 72 73 "use strict"; 74 var xiaoming={ 75 name:"xiaoming", 76 birth:2007, 77 age:function(){ 78 var that=this;//一开始就捕获this,可以放心地在其他方法内部定义其他函数,而不是吧所有的语句都写在同一个方法中。 79 function getAge(){ 80 var y=new Date().getFullYear(); 81 return y-that.birth; 82 } 83 return getAge(); 84 } 85 }; 86 // xiaoming.age(); 87 console.log(xiaoming.age());//10 88 89 /*7*/ 90 //用apply修复getAge()调用 91 //要指定函数的this指向哪个对象,可以用函数本身的apply方法,该方法接收两个参数,一个是要绑定的this变量,第二个参数是Array,表示函数本身的参数。 92 // function getAge(){ 93 var y=new Date().getFullYear(); 94 return y-this.birth; 95 } 96 97 var xiaoming={ 98 name:"xiaoming", 99 birth:2007, 100 age:getAge 101 } 102 103 console.log(xiaoming.age());//10 104 console.log(getAge.apply(xiaoming,[]));//10 105 106 /*8*/ 107 108 //apply()方法与call()方法 109 //apply()方法是把参数打包成Array再传入。 110 //call()方法把参数按顺序传入。 111 112 //eg:条用Math.max(3,4,5) 113 Math.max.apply(null,[3,4,5]);//5 114 Math.max.call(null,3,4,5);//5 115 //对于普通函数调用,我们通常把this绑定为null。 116 117 /*9*/ 118 119 //注意:利用apply(),可以动态改变函数的行为。以下函数的作用是统计parseInt函数被调用了几次。 120 var count=0; 121 var oldParseInt=parseInt; 122 123 window.parseInt=function(){ 124 count+=1; 125 return oldParseInt.apply(null,arguments) 126 }; 127 128 parseInt('10'); 129 parseInt('20'); 130 console.log(count);//2