js new执行的原理_阿里面试题

题目

function Dog(name) {
    this.name = name;
}
Dog.prototype.bark = function () {
    console.log('wangwang');
}
Dog.prototype.sayName = function () {
    console.log('my name is ' + this.name);
}

/*
let sanmao = new Dog('三毛');
sanmao.bark();
sanmao.sayName();
*/

function _new () {
    // 完成你的代码
}

let sanmao = _new(Dog, '三毛');
sanmao.bark(); //=>"wangwang"
sanmao.sayName(); //=>"my name is 三毛"
console.log(sanmao instanceof Dog); //=>true

实现 _new 

// Func要操作的这个类(最后要创建这个类的实例)
// ARGS存储未来传递给Func类的实参
function _new(Func, ...args) {
    // 1.创建一个FUNC的实例对象(实例.__proto__=>类.prototype)
    // 在IE浏览器中,禁止我们使用__proto__(也可以理解为IE并没有提供给我们__proto__这个属性,防止我们去改变原型指向)
/* 不兼容IE
    let obj = {};
    obj.__proto__ = Func.prototype;
*/
let obj = Object.create(Func.prototype);

    // 2.把FUNC当做普通函数执行(让方法中的THIS指向创建的实例)
let result = Func.call(obj, ...args);

    // 3.分析函数执行的返回值(没有返回值或者返回的是原始值类型则默认都返回创建的实例,否则以函数自身返回的为主)
    if (result !== null && /^(object|function)$/.test(typeof result)) {
        return result;
    }
    return obj;
}

实现 Object.create()

Object.create([OBJECT]) 原理:

创建一个空对象x,并且把[OBJECT](这个值需要是一个对象)作为新对象的原型指向x.__proto__=[OBJECT]

特例:Object.create(null):创建一个没有原型/原型链的空对象(不是任何类的实例)

// 我们写的这个方法不支持null的处理
Object.create = function create(prototype) {
    if (prototype === null || typeof prototype !== "object") {
        throw new TypeError(`Object prototype may only be an Object: ${prototype}`);
    }
    // 创建一个类,创建这个类的实例,实例.__proto__=类.prototype;而我们让类.prototype等于传递的    prototype;
    function Temp() {}
    Temp.prototype = prototype;
    return new Temp;
};

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值