Сообщение от Mixxx
|
Исправил вашь код:
function log(a){document.body.innerHTML+=a+'<br>'}
//функция хуман это не конструктор, она возвращает конструктор которы надо потом инициализировать с помощью new
var human = (function () {
var prototype = {}
//prototype.getName
var _data, _name;
prototype.setName = function (str)
{
if (str) _name = str
}
prototype.getName = function ()
{
return _name
}
function constructor(data) {
//this.name
_data=data
}
constructor.prototype = prototype
return constructor
})
var Alfa = new (human())() //столько скобок нужно что бы new относилось к constructor а не к human,
Alfa.setName('Vasia')
log('Alfa: '+ Alfa.getName() )
var Beta = new (human())()
Beta.setName('Petia')
Beta._name='Евгений Ваганыч'; //создаться публичное свойство _name но приватное _name не изменится
log('Beta: '+ Beta.getName() );
log('Alfa: '+ Alfa.getName() )
Раед,
Вашь код не работает в IE9 и Опере (в других не тестил)
опера ругается Uncaught exception: TypeError: 'h1.getName' is not a function
И я не понимаю что за синтаксис такой +function
|
Это конечно решение, но я так понимаю смысл использование прототипов теряется? Потому как: Alfa.__proto__ !== Beta.__proto__ Ну то-бишь не реюзится отсылка к прототипу уже, а попросту новые прототипы?
В таком случае решение с символом «_» — лучший вариант, когда нужны тру-прототипы.