在对象内部调用方法

时间:2014-05-01 08:42:03

标签: javascript object

我正在尝试创建一个多语言的javascript对象。类似的东西:

function language(lang){
    this.error = {
        fname : function(lang){
            var fname = {
                vn : "Tên",
                en : "First Name",
            };
            return fname.lang;
        },
    };
}

当我尝试使用此号码fname时,

var lang = new language("en");
console.log(lang.error.fname);
事实证明 function(lang){var fname = {vn : "Tên",en : "First Name",};return fname.lang;}代替First Name。我的代码出了什么问题?我怎样才能正确获得fname值?

我是JS的新手。如果有人帮我解决这个问题,我感激不尽。

3 个答案:

答案 0 :(得分:1)

您需要像fname

一样致电function

lang.error.fname()

此外,您应该修改您的功能,因为目前您在lang函数内部fname()变量:

 fname : function(){
        var fname = {
            vn : "Tên",
            en : "First Name",
        };
        return fname[lang];
    }

FIDDLE

答案 1 :(得分:1)

作为快速修复,您需要在返回值时使用[]语法,并从lang函数中删除fname()参数,因此它变为:

Fiddle

function language(lang){
    this.error = {
        fname : function(){
            var fname = {
                vn : "Tên",
                en : "First Name",
            };
            return fname[lang];
        },
    };
}

language = new language('en');
console.log( language.error.fname() );

这有效,但它不是一个非常好的结构。看看获取翻译的语法,看起来很奇怪,为什么fname()是一个函数?另外,看看如何定义翻译,它们与许多JavaScript函数和逻辑混合在一起,这使得它很难维护,任何人都无法添加不熟悉JavaScript的翻译。


让我们看一下不同的结构:

Fiddle

function language(lang){
    var translations = {
        vn : {
            error_fname : "Tên",
        },
        en : {
            error_fname : 'First Name',
            error_lname : 'Last Name'
        }
    };

    var currentLang = 'en'; // default

    function get(key){
        return translations[currentLang][key];
    }

    // public pointers
    this.get = get;

    // constructor
    if(typeof lang != 'undefined' && translations[lang]){
        currentLang = lang;   
    }
}

var language = new language('en');
console.log( language.get('error_fname') );

首先看一下如何定义翻译。它非常清楚,所有英文翻译都有一个en对象。所有的英文翻译都存在于en对象中 - 对吗?没有JavaScript逻辑与翻译混合在一起,这意味着您可以执行诸如使用JSON结构之类的事情,这些结构可以由不熟悉JavaScript的翻译人员阅读。您甚至可以为翻译人员提供一个基本的.ini文件,并将其转换为此JavaScript / JSON结构,因为它简单。

还有其他一些好处,例如翻译是封装的,如果不通过get()方法就无法直接访问。


这是一种不同的方式,它使用.语法来获取翻译:

Fiddle

function language(lang){
    var translations = {
        vn : {
            error_fname : "Tên",
        },
        en : {
            error_fname : 'First Name',
            error_lname : 'Last Name'
        }
    };

    var currentLang = 'en'; // default

    if(typeof lang != 'undefined' && translations[lang]){
        currentLang = lang;   
    }

    return translations[currentLang];
}

var language = language('en');
console.log( language.error_fname );

没有get()功能,您可能会或可能不会这样做。我个人更喜欢另一种方式,因为封装和OOP风格。

答案 2 :(得分:0)

你写的方式有点奇怪:

function language(lang){ // Constructor, that's ok
    this.error = {  // An attribute that is another object
        fname : function(lang){ // this attribute has a function
            var fname = { // the function has another object as a local variable with the same name!
                vn : "Tên",
                en : "First Name",
            };
            return fname.lang; //the object has vn and en attributes, but no lang
        },
    };
}

我会尝试定义你想要的结构类型,然后从头开始重写那个混乱。