我正在学习编码,我对我找到的一些示例代码有疑问:
var Comment = new Schema({
user:userStub,
time:Date,
content: {type:String, required: true, trim:true}
});
根据我对OOP的了解,我认为Comment
的{{1}}对象实例将构建如下:
Schema
有人知道通过function Schema (user, time, content){
this.user = user;
this.time = time;
this.content = content;
};
var Comment = new Schema (userStub, time, content);
构建Comment
实例的优势吗? var Comment = new Schema({
表示什么?任何帮助将不胜感激
答案 0 :(得分:1)
这样做的一个好处是你可以改变你的功能 没有改变它的签名。另一个优点是,如果你 有很多输入参数并非都是强制性的,你没有 必须为您不使用的参数添加默认值... - @Michiel Reyers
以下是一个示例,说明如何在构造函数中使用 Object Literal 作为参数创建新的“instance”,删除参数列表:
function Schema (options) {
"use strict";
options = options || {};
this.user = options.user || "unnamed";
this.time = options.time || null;
this.content = options.content || {};
}
在前面的方法中,我们可以通过在entry参数中指定none,one或all属性来创建新对象。除了构造函数的签名保持不变:
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 }
});
此外,您可以扩展对象,因此通过在entry参数中将新属性扩展到实例中,构造函数可以更灵活。对于这个例子,我将使用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);
答案 1 :(得分:0)
Schema的constuctor函数的输入类型在这种情况下是一个对象,因此是{}符号。
function Schema (o){
this.user = o.user;
this.time = o.time;
this.content = o.content;
};
对象只是一个变量,就像字符串或数字一样。所以你可以把它传递给一个函数。但是,不是首先创建一个对象,而是将示例中的输入对象写入调用,如此
mySchema = new Schema({user:'john'});
而不是:
var myObj = {user:'john'};
mySchema = new Schema(myObj);
这样做的一个好处是你可以在不改变签名的情况下改变你的功能。另一个优点是,如果您有许多输入参数并非都是强制性的,那么您不必为您不使用的参数添加默认值。 例如:
var mySchema1 = new Schema({size:25});
var mySchema2 = new Schema({name:'the best schema ever'});
如果函数签名是:
function Schema(size,name) {
// code here
}
您必须致电:
var mySchema2 = new Schema(0,'the best schema ever');
其中0是size的默认值。 你可以想象,当有很多参数时,这可能很烦人。