做这种方式的好处是,你可以改变你的函数 没有量变到质变它的签名。另一个优点是,如果你 有大量的输入参数与不都是强制性的,你不 必须添加默认值,你不使用参数... – @Michiel Reyers
下面是如何创建一个新的“实例”与对象文本如在构造函数中的参数,除暴安良的参数列表中的一个例子:
function Schema (options) {
"use strict";
options = options || {};
this.user = options.user || "unnamed";
this.time = options.time || null;
this.content = options.content || {};
}
在前面的方法中,我们可以通过在入口参数中指定none,一个或所有属性来创建新对象。除了构造方法的签名保持不变:
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);
嗨米歇尔感谢您的回答,但我还是有点糊涂了,你可以请解释构造函数的输入类型如何成为外行人的对象? –
现在有道理!这样做的好处是什么? –
只是增加了一些关于优点的解释。 – Michiel