2013-12-19 2 views
1

Я создаю текстовое приключение, чтобы изучить javascript, и я не уверен, как найти объекты при использовании прототипа объекта. С буквального синтаксиса, например, я определил объекты местоположение:Структура данных для литералов и прототипов.

locations = { 
    yard : { 
     title: "Yard", 
     description: "You are in the Yard. You can go east.", 
     exits : { 
      north : -1, 
      east : "foyar", 
      south : -1, 
      west : -1 
     }, 
     items: ["lamp"], 
     points: 5 
    }, 
     // etc.. 
} 

и может найти информацию, как это (например):

currentLocation = locations[currentLocation]["exits"][direction] 

... но я не очень знаете, как организовать и найти объекты, когда я определяю их от прототипа:

function item(){ 
    this.id = undefined; 
    this.title = ""; 
    this.description = ""; 
    this.points = 0; 
    this.canTake = false; 
} 

var glasses = new item(); 
glasses.id = 1; 
glasses.title = "Glasses"; 
glasses.description = "A scratched up pair of glasses. They aren't your prescription"; 
glasses.points = 10; 
glasses.canTake = true; 

Какой самый лучший способ структурирования и обратиться к моим данным здесь? (И есть ли особые преимущества для использования литерального или прототипного подхода в этом контексте?)

+4

Для чистых объектов данных, которые разделяют ни методов, ни (по умолчанию) свойства данных, нет никакой выгоды от использования прототипов. Пойдите с литералами простого объекта. – Bergi

+0

Да, это выглядит так. но для будущей ссылки есть ли способ организовать и ссылаться на объекты, основанные на прототипе, если я хочу ссылаться на них так, как я описал? –

+0

Вы передадите данные в качестве аргументов конструктору либо как несколько параметров, либо даже как цельный литерал объекта. – Bergi

ответ

0

Если у вас несколько экземпляров объектов одного и того же типа (как, кажется, элемент), и они имеют поведение, то вы поместите поведение на прототипе. Это связано с тем, что он разделяется между экземплярами и сэкономит вам процессор и память при их создании/хранении. Это также позволит вам использовать аналогичную логику элемента, используя наследование (Employee - это Лицо, поэтому имя, возраст и пол могут быть инициализированы Лицом и повторно использованы Employee без копирования и вставки кода)

Например : если у вашего объекта есть функция useIt, то совпадение будет вести себя по-другому от более легкого, поскольку совпадение может быть использовано в течение короткого времени один раз, а зажигалка может использоваться несколько раз и в течение более длительного времени (пока она не станет слишком горячей и взрывается) ,

Подробнее о том, как создавать экземпляры и использовать прототип, можно найти in this answer.

Вот некоторые примеры кода, как можно создать Место и пункт:

//constructor for Item 
var Item=function(args){ 
    //set canuse default to true or whats 
    // passed in args 
    this.canUse=(typeof args.canUse==="undefined")? 
    true:args.canUse; 
    //cannot create an Item without description 
    // description doesn't have a default value 
    if(typeof args.description==="undefined") 
    throw new Error("Cannot create an item without description"); 
    this.description = args.description; 
    //default value for usedTimes is 0 but can be an old 
    // lighter that's been hused hundreds of times 
    this.usedTimes=(typeof args.usedTimes==="undefined")? 
    0:args.usedTimes; 
}; 
//behavior on the prototype 
Item.prototype.useIt=function(){ 
    this.usedTimes++; 
}; 

//specify a match (should add jsdoc here so you know what args can be passed) 
var Match=function(args){ 
    //re use Item code 
    Item.call(this,args); 
    //how powerfull is the Match (defaults to 5) 
    this.burnPower=(typeof args.burnPower==="undefined")? 
    5:args.burnPower 
}; 
//Match behavior 
Match.prototype.useIt=function(args){ 
    if(this.usedTimes!==0){ 
    //tell user it's used up 
    return; 
    } 
if(args.strikeOn && args.strikeOn.strikableSurface!==true){ 
    //tell user to to define a surfice to strike the match on 
    return; 
    } 
    if(!args.useOn){ 
    //tell user to use it on ... 
    } 
    if(args.useOn.toBurn<=this.burnPower){ 
    //burn it and call Item to indicate it's used 
    Item.prototype.useIt.call(this); 
    } 
}; 

//constructor for location 
var Location = function(args){ 
    this.type=args.type; 
    if(typeof this.type==="undefined") 
    throw new Error("Cannot create a location without specifying type"); 
    this.title=(typeof args.title==="undefined")? 
    args.type:args.title; 
    //other stuff where type is mandatory 
    this.items=[]; 
} 
Location.prototype.addItem=function(item){ 
    this.items.push(item); 
}; 
var args={},locations = {}; 

var loc=new Location({type:"Yard"}); 
loc.addItem(new Match({description:"A small match"})); 
locations[loc.type]=loc; 
console.log(locations); 
+0

спасибо. это дает мне много о чем поучиться. Я не уверен, однако, если он обращается к моему основному вопросу о том, как организовать и ссылаться на данные из объекта-прототипа. –

+0

@GregoryTippett не уверен, что это значит, но если вы создаете очки с очками = новые очки ({type: Item.glasses}); 'then useIt будет ссылаться на него самостоятельно, используя' this', например: 'Glasses. prototype.useIt = функция() {Item.prototype.useIt.call (это); if (this.usedTimes) ...} 'Это объясняется в ссылке в ответе. Лучше всего было бы для конструктора Item обрабатывать вещи, специфичные для конкретного предмета (например, usedTimes ++ при вызове useIt) и Glasses для наследования с Item с расширением определенного поведения Glasses. – HMR

+0

@GregoryTippett Я добавил несколько примеров кода, надеюсь, что это поможет. – HMR

Смежные вопросы