2016-06-30 3 views
0

Я пытаюсь сделать очень простой ООП в Javascript (Node.js), но с проблемами. Я уже все пробовал, включая поиск, но не нашел ответа.Функция объекта Javascript возвращает null

В принципе, у меня есть этот файл Test.js:

class Test { 

constructor(){ 
    this.name = 'Hey'; 
    this.config = 'null!'; 
    console.log('this.config: ' + this.config); 
} 

config(msg){ 
    this.config = msg; 
    console.log('new this.config: ' + this.config); 
} 

} 

module.exports = Test; 

(я пробовал это :)

function Test() 
{ 
    this.name = 'Hey'; 
    this.config = 'null!'; 
    console.log('this.config: ' + this.config); 
} 

Test.config = function(msg) // and Test.prototype.config 
{ 
    this.config = msg; 
    console.log('new this.config: ' + this.config); 
} 

module.exports = Test; 

И у меня есть этот другой app.js файл:

var TestModule = require('./Test.js'); 
var Test = new TestModule(); 
var test = Test.config('hi'); 

Другой способ, которым я пробовал:

а также не работал.

Я пробовал много разных вещей уже, но несмотря ни на что, когда я пытаюсь запустить конфигурационную функцию в том же экземпляре, объект обращается в нуль ... кто-нибудь знает, почему это происходит? Может быть, мне не хватает чего-то действительно очевидного.

+3

Функция 'config()' не имеет оператора 'return'. – Pointy

+3

И если вы не используете нотацию класса, это определенно должно быть 'Test.prototype.config' – Pointy

+0

Возможный дубликат [Обнаружение неопределенного свойства объекта] (https://stackoverflow.com/questions/27509/detecting-an -undefined-object-property) –

ответ

0

Вы первый фрагмент правильно

class Test { 

    constructor() { 
     this.name = 'Hey'; 
     this.config = 'null!'; 
     console.log('this.config: ' + this.config); 
    } 

    config(msg) { 
     this.config = msg; 
     console.log('new this.config: ' + this.config); 
    } 

    } 

    module.exports = Test; 

config является метод экземпляра не метод класса или статический метод.

Вам необходимо позвонить config() на тестовом экземпляре. как

var Test = require('./Test.js'); 
var testObj = new Test(); 

Теперь testObj является экземпляром, и вы можете вызвать config() метод этого объекта.

test.config('Hi'); 

Он будет печатать/записывать сообщение, но оно не будет возвращать любую вещь, но undefined, потому что вы ничего из этого метода не возвращаются.

Надеюсь, это объяснит проблему.

+0

О, я вижу. Таким образом, это можно было бы сделать с помощью 'new Test().config ('hi') ', если я действительно использовал конструктор в функции config, правильно? –

+0

Да, вы правы, но вы не можете назначить это переменной, потому что она ничего не возвращает. –

+0

Понял. Благодаря! :-) –

0

Вы назначаете var Test значение return функции config.

var test = Test.config('hi!'); 

В config ничего не возвращает, то это приведет к test быть нулевым.

Вы должны либо сделать свой config метод возвращения что-то (это будет форма "method chaining" design pattern), или просто не назначить результат config вызова переменной.

Например, вы могли бы просто сделать это:

var test = new TestModule(); 
test.config('hi!'); 
// the 'test' variable still contains a reference to your test module 
Смежные вопросы