创建Javascript对象的不同方式?

时间:2013-06-20 14:32:00

标签: javascript object constructor schema instance

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

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({表示什么?任何帮助将不胜感激

2 个答案:

答案 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的默认值。 你可以想象,当有很多参数时,这可能很烦人。