wengjq / Basics

前端基础知识

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

JavaScript 深入之 new 的模拟实现

wengjq opened this issue · comments

mqyqingfeng/Blog#13

function new() {
    var obj = new Object(),

    var Constructor = [].shift.call(arguments);

    obj.__proto__ = Constructor.prototype;

    var ret = Constructor.apply(obj, arguments);

    return typeof ret === 'object' ? ret : obj;
};

function new() {
    var obj = new Object();
    Constructor = [].shift.call(arguments);
        // 寄生继承
    var F = function () {};
    F.prototype = Constructor.prototype;
    obj = new F();
    
    var ret = Constructor.apply(obj, arguments);

    return typeof ret === 'object' ? ret : obj;
};

发生看如下四步操作:

  • 创建一个新的对象,这个对象的类型是 object 。
  • 该对象的 prototype 设置为构造器的 prototype 属性,即 this.prototype = Foo.prototype (伪代码)
  • 执行构造器函数。
  • 如果构造器函数有返回值,则以该对象作为返回值。若没有 return 或 return 了基本类型,则将上述的新对象作为返回值。