2013-06-20 115 views
0

我學習到的代碼和我有一個關於一些示例代碼,我發現一個問題:創建Javascript對象的不同方式?

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

據我瞭解OOP,我想到了SchemaComment對象實例就這樣可以了:

function Schema (user, time, content){ 

    this.user = user; 
    this.time = time; 
    this.content = content; 
}; 

var Comment = new Schema (userStub, time, content); 

任何人都知道通過var Comment = new Schema({建立Comment實例的好處嗎? ({意味着什麼?任何幫助將不勝感激

回答

0

架構的構造函數的輸入類型在這種情況下是一個對象,因此{}表示法。

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是大小的默認值。 你可以想象,當有很多參數時,這可能很煩人。

+0

嗨米歇爾感謝您的回答,但我還是有點糊塗了,你可以請解釋構造函數的輸入類型如何成爲外行人的對象? –

+0

現在有道理!這樣做的好處是什麼? –

+0

只是增加了一些關於優點的解釋。 – Michiel

1

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