原型:应用与调用,新建与创建

Prototype: apply vs call, new vs create

我有一个构造函数,我想将其用作另一个构造函数的原型。都收到参数:

function Proto(arg) {}

function Sub(arg) {}

将参数从 Sub 构造函数传递到 Proto 构造函数的更好方法是什么:

  • Proto.apply(this, arg);
  • Proto.call(this, arg); (双关语无意...)

    二、当我想真正设置原型时,有什么区别:

  • Sub.prototype = Object.create( Proto );
  • Sub.prototype = new Proto();

  • .call.apply 的区别在于 .call 将其参数作为函数的单独参数,而 .apply 将参数作为单个数组。例如:

    function myFunction(x, y) {
        var z;
        // Do something
        return z;
    }
    
    var context = {};
    
    // The following function calls are equivalent:
    var fx = myFunction.call(context, 5, 'h');
    var fy = myFunction.apply(context, [5, 'h']);
    

    如果您在编译时不知道参数列表的长度,则必须使用.apply。但在这种情况下你不需要这样做,你可以使用 .call 稍微简单一点的语法。如果你用 .apply 来做,那就是 Proto.apply(this, [arg]);.

    至于 Object.createnew:同样,您的表达方式有误,应该是 Sub.prototype = Object.create(Proto.prototype);。我通常不使用 Object.create,但据我所知,唯一的区别是 Sub.prototype.constructor 的值。这两种方式可能都无关紧要。但是,new 方式更常见并且接受参数。 (你也可以给 Object.create 另一个参数,但它的工作方式不同。)