函数柯理化以及构建作用域安全的构造函数

1.函数柯理化

概念:

实现:

应用场景:

(1)setTimeout

(2)事件绑定

2.构建作用域安全的构造函数

 一般我们写构造函数时都是采用下面的形式:

function Person(name,age){

this.name=name;

this.age=age;

}

调用时采用var p=new Person("ddd",23);这样的形式,但是如果,不采用new操作符,直接调用var p=Person("ddd",23);就会造成构造函数内的this指向window,造成window对象内的属性混乱,所以有必要在构造函数内重新审核判断一下:

function Person(name,age){

if(this instanceof Person){

this.name=name;

this.age=age;

}else {

 return new Person(name,age);

}

}

但是这样写也有一个问题,会出现在只使用构造函数窃取模式的继承而未使用原型进行继承时,例如如果有个Chinese类通过构造函数窃取继承了 Person类。

function Chinese(name,age,nation){

  Person.call(this,name,age);

this.nation=nation;

}

var c=new Chinese("zhangdan",23,"han");

console.log(c.name);//undefined

在这段代码中,Person的构造函数时作用域安全的,儿chinese构造函数不是,先创建一个chinese实例之后,这个实例通过Person.call来继承Person的name和age属性,但是,由于Person构造函数时作用域安全的,this对象并非Person的实例,所以会创建并且返回一个新的Person对象,chines构造函数中的this对象并没有得到增长,同时Person.call()返回的值也没有用到,所以chinese实例中没有name和age属性,但是如果将原型继承增加进来就可以了。

将构造函数窃取模式继承与原型继承组合起来,就可以解决该问题,加入以下代码:

Chinese.prototype=new Person(); 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值