js 里边的new都做了什么及实现一个new

//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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值