2.4构造函数模式扩展

function Fn(){
  var num = 10;
  // this -> f1
·  this.x = 100; // f1.x = 100
  this.getX = function () { // f1.getX = function...
  // this-> 需要看getX执行的时候才知道
    console.log(this.x)
  }
}

var f1 = new Fn;

console.log(f1.num) // -> undefined

f1.getX(); // 100 方法中的this是f1 

var ss = f1.getX
ss() // undefined 方法中的this是window

1.在构造函数模式中new Fn执行,如果Fn中不需要传递参数的话,后面的小括号可以省略

2.this的问题:在类中出现的this.xxx = xxx中的this都是当前类的实例,而某一个属性值(方法),方法中的this需要看方法执行的时候,前面是否有“.”才能知道this是谁

3.类有普通函数的一面,当函数执行的时候,var num 其实只是当前形成的私有作用域中的私有变量而已,它和我们的f1这个实例是没有任何关系;只有this.xxx = xxx才相当于

  给f1这个实例增加私有的属性和方法,才和我们的f1有关系...

function Fn() {

  this.x = 100;

  this.getX = function () {

    console.log(this.x)

  }

  return {name:"珠峰"}

}

var f1 = new Fn;

console.log(f1)

4.在构造函数模式中,浏览器会默认的把我们的实例返回(返回的是一个对象数据类型的值);

   如果我们自己手动写了return返回:

  1)返回的是一个基本类型的值,当前实例是不变的;例如:return 100;f1还是当前Fn类的实例

  2)返回的是一个引用数据类型的值,当前的实例会被自己返回的值给替换掉,例如:return {name:"张三"}  我们的f1就不在是Fn的实例了,而是对象{name:"张三"}

猜你喜欢

转载自www.cnblogs.com/z-dl/p/8918667.html