2016-05-19 2 views
1

Я думал, что я «получаю это» с помощью javascript, а затем сталкиваюсь с чем-то подобным. Я не знаю, почему значение для __sfcont не определено.javascript prototype var undefined, но я не уверен, почему.

var __container = "It contains "; 

function myObject() { 
    var temp = 'temp'; 
} 

myObject.prototype = { 
    constructor: myObject, 
    searchingFor: { 
    __sfcont: "a div block ", 
    label: this.__sfcont + "and a label.", 
    dropdown: this.__sfcont + "and a dropdown." 
    } 
}; 

var myObj = new myObject(); 

console.log(myObj.searchingFor.label); 

Ожидаемый результат от этого будет It contains a div block and a label. Но я получаю undefinedand a label.

+1

Поэкспериментируйте с 'ярлыком: this.toString()' и посмотреть, что получится , –

+1

Вы не назначаете '__container' в любом месте. – sdgluck

+2

Это может сбивать с толку, потому что вы можете проследить его значение, отслеживая свой контекст до ближайшей родительской области. Я думаю, что глаз смотрит на ближайшую фигурную скобку, чтобы найти ближайшую родительскую область, но в этом случае фигурные скобки используются для объявления объектного литерала, а не сферы. –

ответ

6

На момент this.__sfcont + "and a label.", исполнения, this не то, что вы ожидаете. Это не searchingFor, который еще не построен, а контекст, в котором выполняется myObject.prototype = { ... }. Этот контекст не имеет свойства __sfcont.

Сделать labeldropdown тоже) метод:

label: function() { this.__sfcont + "and a label."; }, 
... 

console.log(myObj.searchingFor.label()); 
+1

О, правильно! Благодарю. И как упоминалось в sdgluck, я забыл использовать __container в своем примере кода. Итак, теперь у меня есть 'sfcont: __container +" блок div ",' и 'label: function() {return this .__ sfcont +" и метка. "; }, 'Затем ожидаемый результат. – Machtyn

2

Вы не можете получить доступ к свойствам объекта, а инициализация. Вы можете определить переменную, а затем использовать его:

var __sfcont = "a div block "; 
myObject.prototype = { 
    constructor: myObject, 
    searchingFor: { 
    __sfcont: __sfcont, 
    label: __sfcont + "and a label.", 
    dropdown: __sfcont + "and a dropdown." 
    } 
}; 
2

Вы также можете использовать поглотитель

myObject.prototype = { 
    constructor: myObject, 
    searchingFor: { 
    __sfcont: "a div block ", 
    get label() { 
     return this.__sfcont + "and a label" 
    } 
    } 
}; 

console.log(myObject.searchingFor.label) 
Смежные вопросы