浅谈函数的方法调用模式The Method Invocation Pattern !

var  myObject = {
    num: 0,
    getNum: function (inc) {
        this.num += typeof inc === 'number' ? inc : 1;
    }
  };
 
  myObject.getNum();
  console.log(myObject.num);    // 1
  
  myObject.getNum(1);
  console.log(myObject.num);    // 2
       创建了myObject对象。 它有一个 num 属性和一个 getNum方法(当一个函数被保存为对象的一个属性时,称之为一个方法)。
  
  
第一次调用myObject的getNum方法时,由于未传入实际参数,所以形式参数inc会被替换为undefined,
typeof inc === 'number'为false,三元表达式返回值为1,this.num = this.num + 1;
函数执行到这一步,需要确定this的值。
函数内的参数this的值取决于该函数的调用模式。函数的调用模式有四种:方法调用模式,函数调用模式,构造器调用模式和apply调用模式。
  
  方法调用模式下,函数内的this指向调用该方法的对象!
getNum作为myObject的方法被调用时,即为方法调用模式,表现形式为 对象.方法名() 或 对象["方法名"]()。
此时,getNum函数内的this被绑定到该对象myObject(即this的值为myObject),所以this.num <=> myObject.num;第4行代码赋值运算后myObject.num为1;
  
  第二次调用时,由于传入了实参1,所以形参inc值为1,typeof 1 === 'number'为true,三元表达式返回值为inc即1;
注意:第一次调用后myObject.num的值已经变为1而不是初始化时的0;所以第4行代码赋值运算后myObject.num为 2;   
   P.s. :上述代码中的+=运算符属于赋值运算符(其优先级和=运算符同级)。






posted @ 2017-09-10 21:30  zbyD666  阅读(241)  评论(0编辑  收藏  举报