2013-06-20 2 views
0

я учусь код и у меня есть вопрос о каком-то образце коде я нашел:Другой способ создания объекта Javascript?

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

Из того, что я узнал об ООП, я думал, что экземпляр 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({? Что означает ({? Любая помощь была бы принята с благодарностью

ответ

0

Тип ввода функции 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 Значение по умолчанию для размера. Вы можете себе представить, что это может раздражать, когда есть много параметров.

+0

Привет Михель спасибо за ваш ответ, но я все еще немного запутался, вы можете пожалуйста, объясните, как тип ввода функции конструктора может быть объектом в условиях неспециалиста? –

+0

Теперь имеет смысл! В чем преимущество этого? –

+0

Просто добавлено некоторое объяснение преимуществ. – Michiel

1

Преимущество делать это таким образом, что вы можете изменить свою функцию без changeing это подпись. Еще одно преимущество заключается в том, что если вы много входных параметров, с которыми не все обязательно, вы не должны добавить значения параметров по умолчанию вы не используете ... – @Michiel Reyers

Вот пример того, как можно создать новый «экземпляр» с объекта буквального в качестве параметра в функции конструктора, избавившись от списка параметров:

function Schema (options) { 
    "use strict"; 
    options = options || {}; 
    this.user = options.user || "unnamed"; 
    this.time = options.time || null; 
    this.content = options.content || {}; 
} 

В предыдущем подходе мы можем создавать новые объекты, указывая ни одно, ни одно, ни все свойства в параметре ввода.Кроме того, подпись конструктора остается неизменным:

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);