金丝雀码头
【Javascript⾼级知识】深⼊剖析JS中New⼀个对象的过程(实现原理)new⼀个对象的原理是怎样的呢?
1. ⽤new Object() 的⽅式新建了⼀个对象 objutilize
2. 取出第⼀个参数,就是我们要传⼊的构造函数。此外因为 shift 会修改原数组,所以 arguments 会被去除第⼀个参数
3. 将 obj 的原型指向构造函数,这样 obj 就可以访问到构造函数原型中的属性
4. 使⽤ apply,改变构造函数 this 的指向到新建的对象,这样 obj 就可以访问到构造函数中的属性
5. 返回 obj
如何模拟实现⼀个⾃⼰的new构造器?
// v1
provisional
function objectFactory(){
var obj =new Object(),
// 因为 shift 会修改原数组,所以 arguments 会被去除第⼀个参数
Constructor =[].shift.call(arguments);// 拿到伪数组中的第⼀个参数
// 取出参数中的第⼀个参数,就是我们要传⼊的构造函数,建⽴继承关系
obj.__proto__ = Constructor.prototype;
Constructor.apply(obj, arguments);
return obj;
}
// v2 : 还需要判断返回的值是不是⼀个对象,如果是⼀个对象,我们就返回这个对象,如果没有,我们该返回什么就返回什么。function objectFactory(){
var obj =new Object(),
Constructor =[].shift.call(arguments);
// 建⽴继承关系(⼆者之间的关系)
obj.__proto__ = Constructor.prototype;
// 开始执⾏这个构造函数
var ret = Constructor.apply(obj, arguments);
// 看⼀下构造函数的返回值,是对象还是⼀个基本数据类型?
return typeof ret ==='object'? ret : obj;
}
// v4:ate的原理
// var obj = ate(Constructor.prototype);
// 等价于:
// var obj = new Object();
ri of the guardians// obj.__proto__ = Constructor.prototype;
const_new=function(){
var Constructor =[].shift.call(arguments);
// 1. 创建⼀个对象,这个对象要继承与构造函数的原型对象
var obj = ate(Constructor.prototype);
holland是什么意思// 2. 执⾏这个构造函数
var ret = Constructor.apply(obj, arguments);
大学英语作文return typeof ret ==='object'? ret || obj : obj;
}
// v5: 实现⼀个⾃⼰的new构造函数
const_new=function(){
欧美mv// 从Object.prototype上克隆⼀个对象
var obj =new Object();
counterproposal// 取出来外部传⼊的构造器
soapopera
var Constructor =[].shift.call(arguments);
牛津中小学英语网// 使⽤⼀个中间的函数来维护原型的关系
var F=function(){};
F.prototype = Constructor.prototype;
obj =new F();
// 开始执⾏这个构造函数
var res = Constructor.apply(obj, arguments);
// 确保构造器总是返回⼀个对象(使⽤res || obj 的⽅式来防⽌返回null参数)
return typeof res ==='object'? res || obj : obj;
}