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:"张三"}

function Fn() {
  this.x = 100;
  this.getX = function () {
    console.log(this.x)
  }
}
var f1 = new Fn;
5.检查某一个实例是否属于这个类 -> instanceof
  console.log(f1 instanceof Fn) // true
  console.log(f1 instanceof Object) // true 因为所有的实例都是对象数据类型的,而每一个对象数据类型都是Object这个内置类的一个实例,所以f1也是它的一个实例
  对于检测数据类型来说,typeof有自己的局限性,不能细分object下的对象,数组,正则...
  var a = [];
  console.log(a instanceof Array)// true 说明a是一个数组
function Fn() {
  this.x = 100;
  this.getX = function () {
    console.log(this.x)
  }
}
var f1 = new Fn;
var f2 = new Fn;
 6.f1和f2都是Fn这个类的一个实例,都拥有x和getX两个属性,但是这个两个属性是各自的私有属性,所以:
  console.log(f1.getX === f2.getX);// ->false
  1)in 检测某一个属性是否属于这个对象 (attr in object)不管是私有属性还是共有属性,只要存在,用in来检测都是true
    console.log("getX" in f1) // true 是它的一个属性
  2)hasOwnProperty: 用来检测某一个属性是否为这个对象的私有属性,这个方法只能检测私有的属性
    console.log(f1.
hasOwnProperty("getX")); // ->true getX是f1的私有的属性
 思考:检测某一个属性是否为该对象的公有属性 hasPubProperty
  function hasPubProperty (obj,attr){
    // 首先保证是它的一个属性并且还不是私有的属性,那么只能是公有的属性
    return (attr in obj) && !obj.hasOwnProperty(attr);
  }
  hasPubProperty (f1,"getX")// false

7.isPrototypeOf

原文地址:https://www.cnblogs.com/z-dl/p/8918667.html