2017-01-12 7 views
0

zurückgeben Ich habe vor kurzem begonnen, Prototyp zu lernen und wollte fragen, ob es eine Möglichkeit gibt, so etwas zu machen, aber in funktionierender Form, wenn ich this.lang[array][keys][here] oder etwas ähnliches verwenden würde Wert von this.defaults.translations zurückgeben Der Grund dafür ist, dass ich eine lang-Funktion machen möchte, in der geprüft wird, ob ein gegebener Index existiert, und wenn nein, wird er auf die Standardsprache zurückgreifen.Javascript Prototyp Funktion, die Wert von Array

function Test() { 
    this.output(); 
} 

Test.prototype.defaults = { 
    lang: 'en', 
    translations: { 
     en: { 
     something: [ 
      'Something here' 
     ] 
     } 
    } 
}; 

Test.prototype.lang = function() { 
    return this.defaults.translations[this.defaults.lang]; 
}; 

Test.prototype.output = function() { 
    return this.lang['something'][0]; 
}; 

var test = new Test(); 

AKTUALISIERT: gefunden Lösung, überprüfen Sie meine Antwort unten!

+0

'Funktion Test() {this.output();}' ist falsch. – Redu

Antwort

0

Sie müssen lang anrufen (oder einen Getter verwenden).

function Test() {} 
 
Test.prototype.defaults = { 
 
    lang: 'en', 
 
    translations: { 
 
    en: { 
 
     something: [ 
 
     'Something here' 
 
     ] 
 
    } 
 
    } 
 
}; 
 
Test.prototype.lang = function() { 
 
    return this.defaults.translations[this.defaults.lang]; 
 
}; 
 
Test.prototype.output = function() { 
 
    return this.lang()['something'][0]; 
 
}; 
 
console.log(new Test().output()); // 'Something here'

+0

Ich habe meine Frage aktualisiert, hoffe, dass es hilft zu verstehen, was ich genau erreichen wollte. – allyfai

+0

@allyfai Nein, ich verstehe nicht, was sind 'meine, Argumente, zur Verfügung gestellt 'und was' lang 'soll zurückgeben und was ist falsch mit dem Code, den Sie zur Verfügung gestellt. – Oriol

+0

Sie wissen, wenn Sie mehrere Argumente angeben, zum Beispiel lang ('dies', 'Funktion', 'hat', 'mehrere', 'Argumente'); Sie können alle Argumente in Methode mit dieser magischen Variable namens 'Argumente' Funktion lang() {console.log (Argumente)}, im Grunde, was ich erreichen möchte, ist, dass meine lang Funktionsprüfungen Argumente Argumente vorhanden Schlüssel vorhanden sind aktuelle Sprache, und wenn nein, dann Rückgriff auf die Standardsprache, ich weiß nicht, wie sonst ich es erklären kann. – allyfai

0

nur einen Getter verwenden:

Test.prototype.getLang = function getLang(lang) { 
    return this[lang] || someDefaultLang; 
}; 

var test = new Test(); 
console.log(test.getLang("en")); 

Wenn Sie schicker sein wollen und müssen nicht alt IE unterstützen Sie diese abwechselnd tun können:

Object.defineProperty(Test.prototype, "lang", { 
    get: function(lang) { 
    return this[lang] || someDefaultLang; 
    } 
}); 

console.log(test.en); 

arbeitet in IE 9 +

+0

Ich habe meine Frage aktualisiert, hoffe, dass es hilft zu verstehen, was ich genau erreichen wollte. – allyfai

0

Sie tun es einfach so;

function Test() {}; 
 

 
Test.prototype.defaults = { 
 
    lang: 'en', 
 
    translations: { 
 
     en: { 
 
     something: [ 
 
      'Something here' 
 
     ] 
 
     } 
 
    } 
 
}; 
 

 
Test.prototype.lang = function() { 
 
    return this.defaults.translations[this.defaults.lang]; 
 
}; 
 

 
Test.prototype.output = function() { 
 
    return this.lang(); 
 
}; 
 

 
var test = new Test(); 
 

 
console.log(test.output());

+0

Ich habe meine Frage aktualisiert, hoffe, dass es hilft zu verstehen, was ich genau erreichen wollte. – allyfai

0

Es hängt sehr stark von Ihren zukünftigen Bedürfnissen, aber eine andere Option ist mit statischen Eigenschaften:

function Test() { 
 
    } 
 

 
    Test.defaults = { 
 
     lang: 'en', 
 
     translations: { 
 
      en: { 
 
      something: [ 
 
       'Something here' 
 
      ] 
 
      } 
 
     } 
 
    }; 
 

 
    Test.prototype.lang = function() { 
 
     return Test.defaults.translations[Test.defaults.lang]; 
 
    }; 
 

 
    Test.prototype.output = function() { 
 
     return this.lang()['something'][0]; 
 
    }; 
 

 
    var test = new Test(); 
 
    alert(test.output());

+0

Ich habe meine Frage aktualisiert, hoffe, dass es hilft zu verstehen, was ich genau erreichen wollte. – allyfai

0

gefunden Lösung gibt es was ich getan habe, um zu verwalten, was ich wollte.

function Test() {} 
 

 
Test.prototype.defaults = { 
 
    lang: 'en_GB', 
 
    fallbackLang: 'en_US', 
 
    translations: { 
 
     en_US: { 
 
     strings: [ 
 
      'Color', 
 
      'Chips' 
 
     ] 
 
     }, 
 
     en_GB: { 
 
     strings: [ 
 
      'Colour', 
 
      'Crisps' 
 
     ] 
 
     } 
 
    } 
 
}; 
 

 
Test.prototype.splitToArray = function(array, string) { 
 
    Array.prototype.forEach.call(string.split('.'), function(key) { 
 
     if (typeof array !== "undefined") { 
 
      array = array[key]; 
 
     } 
 
    }); 
 

 
    return array; 
 
}; 
 

 
Test.prototype.__ = function (key) { 
 
    var self = this, 
 
     translation = this.splitToArray(self.defaults.translations[self.defaults.lang], key); 
 

 
    if (typeof translation === "undefined") { 
 
     // Set to fallback language if translation is not found 
 
     translation = this.splitToArray(self.defaults.translations[self.defaults.fallbackLang], key); 
 

 
     if (typeof translation === "undefined") { 
 
      // return given key if translation is not found 
 
      return key; 
 
     } 
 
    } 
 

 
    return translation; 
 
}; 
 

 
console.log(new Test().__('strings.0'));

Verwandte Themen