做這種方式的好處是,你可以改變你的函數 沒有量變到質變它的簽名。另一個優點是,如果你 有大量的輸入參數與不都是強制性的,你不 必須添加默認值,你不使用參數... – @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