原型:apply vs call,new vs create

时间:2015-01-21 20:53:48

标签: javascript constructor prototype

我有一个构造函数,我想用它作为另一个构造函数的原型。两者都接受了论点:

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();

  • 1 个答案:

    答案 0 :(得分:1)

    .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另一个论点,但它的工作方式不同。)