和人交流时发现,现在面试可能会问到如何手写一个new,也就是如何自己手写方法实现new()功能 ,觉得自己从没想过,记录一下。
首先 js是如何实现new的
function Person(name){
this.name = name
}
Person.prototype.eat =function() {
console.log("Eating")
}
var qd = new Person('qd')
console.log(qd)
qd.eat();
这就是js如何使用一个new的方法
手写new如下:
function create() {
//1.获取构造函数,并删除arguments中的第一项
var Con = [].shift.call(arguments);
//2.创建一个空对象并连接到构造函数的原型,使它能够访问原型中的属性
var obj = Object.create(Con.prototype);
// 3.使用apply改变构造函数中this的指向实现继承,使obj能够访问到构造函数中的属性
var ret = Con.apply(obj,arguments);
4.优先返回构造函数返回的对象
return ret instanceof Object ? ret : obj;
}
function Person (name) {
this.name = name
}
Person.prototype.eat =function() {
console.log("Eating")
}
//调用
var qdleader = create(Person,'qdleader');
console.log(qdleader);
qdleader.eat()
当然 create也可以这样写
function create() {
// 创建一个空的对象
let obj = {}
// 获得构造函数
// 因为 arguments 类数组,所以我们可以用数组的shift来实现 arguments 的 ‘push’ 和 ‘pop’
// 将 arguments 进数组,并将第一个元素移除并赋值给
Con (Constructor).letCon = [].shift.call(arguments)
// 链接到原型
obj.__proto__ = Con.prototype
// 绑定this,并执行构造函数,就相当于 obj .constructor(arguments)
let result = Con.apply(obj, arguments)
// 确保 new 出来的是个对象
return typeof result ==='object'? result : obj
}
当然现实开发咱们直接使用new就好,这都是面试官测试你的专业知识而已,参考了网上的各种文章,不会百度的前端不是好的橱子。