0

我正在学习编码,我对找到的一些示例代码有疑问:

var Comment = new Schema({
    user:userStub,
    time:Date, 
    content: {type:String, required: true, trim:true}
});

根据我对 OOP 的了解,我认为Comment对象实例的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({吗?有什么({意义?任何帮助将不胜感激

4

2 回答 2

1

这样做的一个好处是您可以在不更改其签名的情况下更改您的功能。另一个优点是,如果您有很多输入参数并非都是强制性的,那么您不必为不使用的参数添加默认值... – @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);
于 2013-10-31T18:50:22.883 回答
0

在这种情况下,Schema 的构造函数的输入类型是一个对象,因此使用 {} 表示法。

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 是大小的默认值。你可以想象当有很多参数时这会很烦人。

于 2013-06-20T14:35:31.283 回答