我最近开始学习原型并且想问一下是否有某种方法可以制作这样的东西,但是在工作状态下,如果我使用this.lang[array][keys][here]
或类似的东西,它会从this.defaults.translations
原因返回值在这背后是,我不想制作lang函数,它将检查给定的索引是否存在,如果没有,那么它将回退到默认语言。
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();
更新: 找到解决方案,请查看下面的答案!
答案 0 :(得分:0)
您需要致电lang
(或使用吸气剂)。
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'
答案 1 :(得分:0)
只需使用吸气剂:
Test.prototype.getLang = function getLang(lang) {
return this[lang] || someDefaultLang;
};
var test = new Test();
console.log(test.getLang("en"));
如果你想成为更好的并且不需要支持旧的IE,你可以交替这样做:
Object.defineProperty(Test.prototype, "lang", {
get: function(lang) {
return this[lang] || someDefaultLang;
}
});
console.log(test.en);
适用于IE 9 +
答案 2 :(得分:0)
你就是这样做的;
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());

答案 3 :(得分:0)
这在很大程度上取决于您未来的需求,但另一个选择是使用静态属性:
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());

答案 4 :(得分:0)
找到解决方案,我有办法管理我想要的东西。
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'));