2015-01-13 6 views
0

Я пытаюсь понять ООП в javascript и написал эти два файла. Моя проблема - неожиданный результат работы прототипов: undefined.Функции прототипа Javascript OOP возвращаются undefined

Я пропустил что-то или сделал что-то не так?

Модуль:

/*jslint node: true */ 

function User(tid, tname, ttype) { 
    'use strict'; 
    this.id = tid; 
    var name = tname, 
     type = ttype; 

    console.log("user: " + this.id + " created."); 
} 

User.prototype.getName = function() { 
    'use strict'; 
    return this.name; 
}; 

User.prototype.getType = function() { 
    'use strict'; 
    return this.type; 
}; 

module.exports = User; 

И это реализует класс:

/*jslint node: true */ 
var User = require('./User'); 

var userlist = []; 

function init() { 
    'use strict'; 
    var namelist = ['Boz', 'Nash', 'Joe', 'Angel'], 
     i = 0, 
     tUser; 

    for (i = 0; i < namelist.length; i += 1) { 
     tUser = new User(i + 1, namelist[i], 0); 

     userlist.push(tUser); 

    } 
} 

function print() { 
    'use strict'; 
    var tString, 
     i; 

    for (i = 0; i < userlist.length; i += 1) { 
     tString = "User Entry:" + i + " | "; 
     tString += userlist[i].getName() + " | "; 
     tString += userlist[i].getType() + " | "; 
     tString += userlist[i].id; 
     console.log(tString); 
    } 
} 

init(); 
print(); 

И это выход:

user: 1 created. 
user: 2 created. 
user: 3 created. 
user: 4 created. 
User Entry:0 | undefined | undefined | 1 
User Entry:1 | undefined | undefined | 2 
User Entry:2 | undefined | undefined | 3 
User Entry:3 | undefined | undefined | 4 
+2

нет имя свойства ваших экземпляров объекта, только _id_ – dandavis

+0

Я хотел сделать переменные name и type private, так что они получают только значение один раз, когда объект создается. Затем получают значения только функции геттера. Я предполагаю, что тогда это невозможно? – Flynn

+0

В JS нет частной собственности. хорошо, есть действительно уродливый способ принудительного использования частных свойств с использованием нестрогих методов (через arguments.callee.caller), но я сомневаюсь, что это то, что вы хотите. – dandavis

ответ

3

Проблема здесь в том, как ваши переменные объявлены и назначены :

Попробуйте ...

function User(tid, tname, ttype) { 
    'use strict'; 
    this.id = tid; 
    this.name = tname; 
    this.type = ttype; 

    console.log("user: " + this.id + " created."); 
} 

Назначение переменной делает его доступной для локализации переменной; использование этого позволяет прототипам доступа к переменным. Используя назначение this, переменная присваивается объекту User в вашем случае.

+0

Я не говорил, что это «сфера», но сфера - это проблема ... переделает. – rfornal

+0

Сфера применения: это зависит от перспективы; когда он создавал переменные с помощью var, они были ограничены внутри функции. Мы можем аргументировать это, но я объясню это в своем ответе, чтобы закончить этот комментарий. – rfornal

+0

@dandavis Спасибо за последний комментарий ... – rfornal

0

Не используйте приватную переменную затем:

this.id = tid; 
this.name = tname, 
this.type = ttype; 

Использование var как в вашем примере:

this.id = tid;//available in other functions 
var name = tname, 
    type = ttype;//won't allow you to access in other functions 
Смежные вопросы