构造函数模式扩展

构造函数模式扩展

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

    function Fn() {
      this.x = 100;
      this.getX = function () {
        console.log(this.x)
      }
    }

    var f1 = new Fn;// 不传参数可以省略()

2. this:

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

function Fn() {
  var num =10;
  this.x = 100;
  this.getX = function () {
    console.log(this.x);
  }
}
var f1 = new Fn;
console.log(f1.num)

3. 私有变量

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

f1.getX(); // 100 this --> f1
var s = f1.getX;
s(); // undefined this --> window

4. return

在构造函数模式中,浏览器会默认的把我们的实例返回(返回的是一个对象类型的值);如果我们手动写了return返回值

function Fn() {
  this.x = 100;
  this.getX = function () {
    console.log(this.x);
  }
  return {name:'aa'}
}
var f1 = new Fn;
console.log(f1)
  • 1) 返回的是一个基本类型的值,当前的实例是不变的,f1还是当前Fn类的实例
  • 2) 返回的是一个引用数据类型的值,当前的实例会被自己返回的值给替换掉,例如return {name:'aa'},那么我们的f1就不再是Fn的实例,而是对象{name:'aa'}

5.检测某一个实例是否属于这个类 使用instanceof

function Fn() {
  this.x = 100;
  this.getX = function () {
    console.log(this.x);
  }
}
var f1 = new Fn;
console.log(f1 instanceof Fn) // true
console.log(f1 instanceof Object) // true

所有的实例都是对象数据类型的,而每一个对象数据类型都是Object这个内置类的一个实例,所以f1也是它的一个实例

6. in和hasOwnProperty

  • in:检查某一个属性是否属于这个对象(attr in object)
  • hasOwnProperty:用来检测某一个属性是否为这个对象的“私有属性”,这个方法只能检测私有的属性
function Fn() {
  this.x = 100;
  this.getX = function () {
    console.log(this.x);
  }
}
var f1 = new Fn;
console.log('getX' in f1) // true
console.log(f1.hasOwnProperty('getX')) // true

检测某一个属性是否为该对象的”公有属性”

function hasPubPubProperty(obj, attr) {
  return (attr in obj) && !obj.hasOwnProperty(attr);
}
console.log(hasPubPubProperty(f1,'getX'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值