这样做的一个好处是您可以在不更改其签名的情况下更改您的功能。另一个优点是,如果您有很多输入参数并非都是强制性的,那么您不必为不使用的参数添加默认值... – @Michiel Reyers
这是一个示例,说明如何在构造函数中使用 Object Literal 作为参数创建一个新的“实例” ,从而摆脱参数列表:
function Schema (options) {
"use strict";
options = options || {};
this.user = options.user || "unnamed";
this.time = options.time || null;
this.content = options.content || {};
}
在前面的方法中,我们可以通过在 entry 参数中指定无、一个或所有属性来创建新对象。除了构造函数的签名保持不变:
var comment;
//no arguments
comment = new Schema();
//only one option
comment = new Schema({ user: "luis" });
//multiple options
comment = new Schema({
user: "Federico",
time: new Date(1995, 10 - 1, 31), //october 31, 1995
content: { type: Types.String, required: true, trim: true }
});
您还可以扩展对象,因此构造函数可以通过将入口参数中的新属性扩展到实例中来更加灵活。对于这个示例,我将使用jQuery(我知道,不在标签中),但是您可以创建自定义方法来扩展对象而不使用 jQuery。
//pointer to the internal Schema
var Schema = (function () {
//cached default values
var defaults = {
user: "unnamed",
time: null,
content: {}
};
//constructor extensible
function Schema (options) {
"use strict";
//merges @options and @defaults into the instance @this
jQuery.extend(this, defaults, options);
}
//returns the reference to Schema;
return Schema;
}());
这里我们使用了构造函数模式。您可以使用Schema
和添加新属性,而无需修改构造函数的签名。(另见MODULE模式)。
var comment = new Schema({ user: "Felipe", age: 31 });
对前一种方法的改进是在构造函数原型中设置默认值:
//pointer to the internal Schema
var Schema = (function ($) {
//constructor extensible
function Schema (options) {
"use strict";
//merges @options into the instance @this
$.extend(this, options);
}
//sets the default values
Schema.prototype = {
"user": "unnamed",
"time": null,
"content": {}
};
//returns the reference to Schema;
return Schema;
}(jQuery));
var comment = new Schema();
console.log(comment);
comment = new Schema({ user: "coco", age: +"d" });
console.log(comment);