(一) new关键字的作用
- 自动创建临时对象 ( 在函数内部使用this可以访问到这个临时对象 )
- 自动绑定该Function对象的原型 ( 统一叫做prototype )
- 把传入的参数赋给给临时对象
- 自动return这个临时对象
<script>function MadeCat(name, age) {// 查看this.__proto__,说说this指向了谁this.name = name;this.age = age;}var cat = new MadeCat('小白', 2);cat.__proto__ === MadeCat.prototype;// 手动实现上面的步骤,new关键字就是做了以下这些事情function MadeCat2(name, age) {// 1. 创建临时对象objvar obj = new Object();// 2. 绑定临时对象obj的原型对象为MadeCat2的原型对象obj.__proto__ = MadeCat2.prototype;// 3. 把传入的name和age赋给objobj.name = name;obj.age = age;// 4. 返回临时对象objreturn obj;}// 调用MadeCat2得到新的对象,对比上面的例子,谈谈new关键字都起了什么作用,不使用new来创建对象行不行var cat2 = MadeCat2('小黑', 1);cat2.__proto__ === MadeCat2.prototype;</script>
(二) call、apply 和bind有什么区别?
三者都会改变this的指向, 区别:
call 和 apply 的功能相同,区别在于传参的方式不一样:
- call的第一个参数是this要指向的对象, 第二个,第三个….都是调用函数需要的参数。
apply第一个参数是this要指向的对象, 第二个参数是数组或类数组。
<script>// 1. 声明两个变量和一个函数var username = '张三';var age = 18;function say(provice, city) {console.log('this=', this);console.log(`我来自${provice}${city}`);console.log(`我叫${this.username},今年${this.age}岁`);}// 2. 创建一个对象var person = {username: '老胡',age: 100};say('广东', '深圳');// 3. 使用call改变this的指向:第一个参数是this将要指向的对象, 第二参数,第三个参数.....,这些参数函数调用需要传入的参数say.call(person, '广西', '贵港');// 4. 使用apply改变this的指向:第一个参数是this将要指向的对象, 第二参数是个数组,数组放入的是函数需要的参数say.apply(person, ['陕西', '西安']);</script>
bind 和 call/apply 有一个很重要的区别,
- 一个函数被 call/apply 的时候,会直接调用,但是 bind 会创建一个新函数, 不会直接调用
- 当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this, 新函数的调用和原来函数的调用一模一样,除了this的指向不一样之外
