我有一个构造函数,我想用它作为另一个构造函数的原型。两者都接受了论点:
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();
答案 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.create
与new
:同样,您的表达方式错误,应该是Sub.prototype = Object.create(Proto.prototype);
。我通常不会使用Object.create
,但据我所知,唯一的区别是Sub.prototype.constructor
的价值。无论哪种方式,这可能都无关紧要。但是,new
方式更常见并接受参数。 (你也可以给Object.create
另一个论点,但它的工作方式不同。)