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