1.new的四个步骤
创建一个空对象->这个新对象继承函数的原型->更改this的指向,为对象设置属性->返回新对象
let a = new Foo('张三',20)
(1) 我们先创建一个空对象
var obj = {}
(2) 这个新对象继承原型构造函数的原型
obj.__proto__ = Foo.prototype
(3) Foo 函数执行,this指向obj对象
let result = Foo.call(obj,'张三',20)
(4) 返回obj对象
return typeof result === 'object'
2.new 的实现过程
let a = new Foo('张三',20)
console.log(a)
function fn(){
//第一步 创建一个新对象
var obj = {}
// 第二步 原型赋值
obj.__proto__ = Foo.prototype
// 第三步 FOO函数执行,this指向obj对象
let result = Foo.call(obj,'张三',20)
// 第四步 返回obj对象
return typeof result === 'object'
}
this指向
三者共同点:都可以改变this的指向
不同点: call() / apply() / bind()
这就是call和apply不同点在于第二个参数,当参数2是一组数据的时候用apply方法,当参数为一个数据的时候我们可以用call方法
应用场景:伪数组借用数组的方法 NodeList/arguments (arguments只存在函数中)
function fn(){
console.log(arguments)
// 打印出来可以看到一个伪数组
// 要往arguments集合中追加一个数组 100;
// arguments.push(100) 这种直接追加不行,会直接报错 因为他的原型没有push方法
// Array.prototype.push.call(arguments,100)
// 上面我们借用的是数组的构造函数 改变他的指向arguments
// 往arguments集合中追加多个值 [100,200,300]
// Array.prototype.push.call(arguments,[100,200,300])// 这不是我们想要的,我们要是一个个的push进去 这时候我们换成apply就可以了
共同点都是把this指针修改指向第一个参数
这就是call和apply不同点在于第二个参数,当参数2是一组数据的时候用apply方法,当参数为一个数据的时候我们可以用call方法
}
fn (3,4,5,6)