Po wywołaniu action
jak:
commands.back.action();
zakres action
jest back
. Niestety, utworzenie obiektu przypisanego do commands.back
nie wie, że this
wewnątrz action
jest nazywane "back"
.Z mojego rozumowania wynika, że możemy przypisać obiekt przypisany do commands.back
do innego obiektu o innej nazwie. Jak w:
var foo = { f: function(){console.log(this) } };
var bar = foo;
bar.f();
lub bliżej, co masz ...
var foo = {
bar: {
f:function(){console.log(this)}
}
};
var other = { another: (foo.bar) };
Jedynym sposobem, wiem, gdzie obiekt zna nazwę to, co zostało stworzone w ciągu są funkcjami. Możemy więc utworzyć funkcję tymczasową o nazwie back
, która utworzy obiekt zgodnie z potrzebami.
var commands = {
back:(new function back(){
// I prefer to assign to a variable to assist with the readability as to what "this" is:)
var self = this;
self.command = "b";
self.aliases = ["back","go back","backwards"];
self.action = function(){
// Can leave as "this" or change to "self".
return this.key;
};
self.desc = "goes back";
self.key = self.prototype.constructor.name;
})
}
Najprostszym rozwiązaniem
Ale w tym punkcie może równie dobrze dodać obiekt, który ma już nazwę. Polecam raczej wykonanie właściwości o nazwie key
lub name
zamiast umieszczania nazwy bezpośrednio w funkcji action
, aby ułatwić korzystanie z wielu miejsc, w których nazwa jest używana. Pozwala także na jedno miejsce do zmiany nazwy w obiekcie, jeśli zajdzie taka potrzeba.
var commands = {
back:{
command: "b",
aliases: ["back","go back","backwards"],
action: function(){
return this.key;
},
desc: "goes back",
key: "back"
}
}
EDIT: Dodany to edit jako inny sposób to zrobić, ale nadal będzie robić poprzednią stronę. Możemy użyć Object.keys
, aby uzyskać nazwę nieruchomości, ponieważ back
jest dodawana jako właściwość wyliczalna commands
.
var i = 0,
commands = { back: {
key: (function(id){return function(){return Object.keys(commands)[id]}})(i++)
}}
Następnie można uzyskać key
brzmienie:
commands.back.key();
lub wewnątrz action
funkcji jak:
this.key();
można dodać key
do back
jako get
który wyglądałby następująco:
var i = 0,
commands = { back: {
id: (i++),
get key() {return Object.keys(commands)[this.id]}
}}
Umożliwi to dostęp do nieruchomości jako commands.back.key
oraz do funkcji action
jako this.key
.
Można również wstępnie określić wszystko to można wykonać następujące czynności:
var i = 0, commands = { back: undefined };
commands.back = { key: Object.keys(commands)[i++] };
Dodanie do obiektu nadmiarowej nazwy: "wstecz" właściwość odpowiednia dla ciebie? A może po prostu używając 'this.aliases [0]' jeśli to zawsze jest nazwa? –
Jedynym sposobem byłoby powtórzenie właściwości 'commands' i sprawdzenie równości wartości za pomocą' this'. Ale to naprawdę zależy od tego, czy "komendy" są zawsze dostępne w zamknięciu. – Yoshi
@ FrédéricHamidi aliasy [0] nie ma obietnicy posiadania nazwy – TBE