2015-06-10 5 views
0

У меня есть этот модуль:Ссылка другой ключ в объект

exports.yeah = { 
    hallo: { 
    shine: "was", 
    yum: this.hallo.shine 
    } 
} 

Как вы можете видеть, что я стараюсь ссылаться блеск в yum: this.hallo.shine

Но когда я пытаюсь выполнить мой сценарий, я получаю это ошибка:

TypeError: Cannot read property 'shine' of undefined 

Похоже, что сфера не так!

Я пробовал разные вещи, например module.exports.yeah.hallo.shine

Но он просто не будет работать! Как я могу исправить эту ошибку? Благодаря

+0

возможно дубликат [Self-ссылок в объявлениях литералов объекта] (http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations) –

ответ

2

Вы можете использовать Javascript getters

var exports = {}; 
 
exports.yeah = { 
 
    hallo: { 
 
    shine: "was", 
 
    get yum() { 
 
     return this.shine 
 
    } 
 
    } 
 
}; 
 
document.write(exports.yeah.hallo.yum);

Обратите внимание, this в контексте getter будет относиться к hallo, а не к yeah

Согласно документации

The get syntax binds an object property to a function that will be called when that property is looked up.

Так, так как функция геттер называется (поднял голову) после инициализации объекта, this может использоваться для ссылки на shine

Update

Lets say the object is build like that {hallo1: {..}, hallo2: {..} } . And now I want to reference in hallo1.yum = hallo2.shine Is that possible?

Да, это возможно потому, что в то время получать объект инициализируется, и вы можете обратиться к самому объекту, а не this

var exports = {}; 
 
exports.yeah = { 
 
    hallo1: { 
 
    shine: "was", 
 
    get yum() { 
 
     return exports.yeah.hallo2.yum; 
 
    } 
 
    }, 
 
    hallo2: { 
 
    shine: "is", 
 
    get yum() { 
 
     return this.shine; 
 
    } 
 
    } 
 
}; 
 
document.write(exports.yeah.hallo1.yum);

+0

Действительно приятно! Я не знал, что что-то подобное существует. Один вопрос: Давайте скажем, что объект построен так: {hallo1: {..}, hallo2: {..}} '. И теперь я хочу ссылаться в 'hallo1.yum = hallo2.shine' Это возможно? Благодаря! –

+0

Если вы можете использовать их, сделайте! Они действительно хороши и облегчат жизнь. – ssube

+0

@JohnSmith, да можно. См. Мое обновление. – AmmarCSE

2

При ссылке this.hallo, виртуальная машина по-прежнему создает объект и не назначил его hallo еще. Вы должны инициализировать это поле позже.

Для того, чтобы построить свой пример:

exports.yeah = { 
    hallo: { 
    shine: "was", 
    yum: this.hallo.shine 
    } 
} 

ВМ нужно будет создать

{ 
    shine: "was", 
    yum: this.hallo.shine 
} 

и присвоить его hallo, поскольку он создает

{ 
    hallo: { 
    shine: "was", 
    yum: this.hallo.shine 
    } 
} 

который затем ЦЕССИОНАРИЯМ до exports.yeah.

Это очень похоже на определение параметров функции перед вызовом функции.

Когда вы ссылаетесь на this.hallo.shine, эта цепочка еще не создана. Поскольку вы используете объектные литералы, вы также не можете полагаться на this.shine, так как this указывает на область действия.

Вы должны использовать поздно (г) инициализации, как:

exports.yeah = { 
    hallo: { 
    shine: "was" 
    } 
} 
exports.yeah.hallo.yum = exports.yeah.hallo.shine; 
Смежные вопросы