new⼀个函数的时候发⽣了什么
var Fn = {}
var fn = new Fn()
这个过程会执⾏如下步骤:
1.新创建⼀个空对象
var fn = new Object();
2.构造函数的显⽰原型等于实例对象的隐式原型,实例对象的constructor属性为构造函数的名称
Fn.prototype = fn.__proto__
3.通过调⽤call、apply⽅法执⾏构造函数并改变this对象(绑定到实例对象上)
Fn.call(f)
4.如果没有⼿动返回其他任何对象或返回值是基本类型(Number、String、Boolean)的值,会返回 this
指向的新对象,也就是实例,若返回值是引⽤类型(Object、Array、Function)的值,则实际返回值为这个引⽤类型。
var New =function(fn){
//1.新建空对象
var obj={};
//2.实例对象的__proto__等于构造函数的prototype
obj.__proto__=fn.prototype;
//3. 将 arguments 对象转为数组
var args = [].slice.call(arguments);
//4.去除构造函数
args.shift();
//5. 通过调⽤call、apply⽅法执⾏构造函数并改变this对象
var result = fn.apply(obj, args);
//6. 判断返回值,如果是Object类型就直接返回,否则返回实例对象本⾝
if(String.call(result)=="[object Object]" ){
return result
}else{
return obj;
}
}
var Fun=function(sex){
this.name='hty';
this.sex=sex;
}
const fun=New(Fun,'123');
console.log(fun.name);//hty
console.log(fun.sex);//123
⾃⼰⼿写实现⼀个简单的new
function myNew (fun) {
return function () {
// 创建⼀个新对象且将其隐式原型指向构造函数原型
let obj = {
__proto__ : fun.prototype
}
/
/ 执⾏构造函数
fun.call(obj, ...arguments)函数prototype
// 返回该对象
return obj
}
}
function person(name, age) {
this.name = name
this.age = age
}
let obj = myNew(person)('li', 18)
console.log(obj)
注意:
箭头函数中没有 [[Construct]] ⽅法,不能使⽤ new 调⽤,会报错。除了箭头函数之外的任何函数都可以new。
⾃⼰模拟⾯试想到的⾯试题
构造函数怎么调⽤的?(new)
为什么要⽤new来调⽤,⽽不是直接调⽤?
⽤new调⽤的时候,会新建⼀个空的实例对象,将构造函数的显⽰原型等于实例的隐式原型,会将构造函数原型上的属性和⽅法都继承到实例对象中,会将this指向这个新实例对象,如果不⽤new调⽤的话就相当于是⼀个普通函数,this会指向window,也⽆法继承构造函数的任何属性。
String()
返回⼀个表⽰该对象的字符串
可以通过 toString() 来获取每个对象的类型。为了每个对象都能通过 String() 来检测,需要
以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调⽤,传递要检查的对象作为第⼀个参数,称
为 thisArg。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论