//new 的实现
//new 都做了什么
//1.创建了一个新对象
//2.将构造函数作用域赋值一个新对象,this指向这个新对象
//3.执行构造函数中的代码(为这个函数添加新属性)
//4.返回新对象
function create (){
//创建一个空对象
var obj = new Object()
//获取构造函数,arguments的第一个参数,因为arguments是类数组不是真正的数组,所以得需要用call
var Con = [].shift.call(arguments)
//链接到原型,obj可以访问构造函数原型中的属性
obj.__proto__ = Con.prototype
//绑定this实现继承,obj可以访问构造函数中的属性
var ret= Con.apply(obj,arguments)
//优先返回构造函数返回的对象
return ret instanceof Object ? ret:obj
}
//还可以这么实现,
//__proto__ 属性在 ES6 时才被标准化,以确保 Web 浏览器的兼容性,但是不推荐使用,
//除了标准化的原因之外还有性能问题。为了更好的支持,推荐使用 Object.setPrototypeOf
function create2() {
// 1、创建一个空的对象
var obj = new Object(),
// 2、获得构造函数,同时删除 arguments 中第一个参数
Con = [].shift.call(arguments);
// 3、链接到原型,obj 可以访问构造函数原型中的属性
Object.setPrototypeOf(obj, Con.prototype);
// 4、绑定 this 实现继承,obj 可以访问到构造函数中的属性
var ret = Con.apply(obj, arguments);
// 5、优先返回构造函数返回的对象
return ret instanceof Object ? ret : obj;
};
function Car(color) {
this.color = color;
}
Car.prototype.start = function() {
console.log(this.color + " car start");
}
var car = create(Car,"black")
console.log(car.color) //black
car.start() //black car start
js 里边的new都做了什么及实现一个new
最新推荐文章于 2023-09-21 16:36:26 发布