Кроме огорода замыканий не вижу вариантов. Можно, например, создавать в конструкторе одноимённое прототипному свойство, которое будет вызывать функцию с тем же именем. из прототипа, передавая ей приватную переменную. Саму процедуру обёртывания и замыкания можно тоже в прототип переместить. Так в конструкторе повторы будут, конечно, но меньше, чем если просто там размещать все функции. Получается как-то так:
function Human(name) { this.makeWrap("getName", [name]); } Human.prototype = { makeWrap: function (propertyName, args) { this[propertyName] = ( function(args) { return function() { return Human.prototype[propertyName](args); } } )(args) }, getName: function(name) { return name[0]; }, constructor: Human } h1 = new Human("Василий Иванович"); h2 = new Human("Иван Васильевич"); alert(h1.getName()) alert(h2.getName()). Как-то костыльно, nein? Вариант с соглашением проще. и лучше, на мой взгляд. |
Цитата:
|
Цитата:
В таком случае решение с символом «_» — лучший вариант, когда нужны тру-прототипы. |
GuardCat,
Посмотрел вашь код понял что вы предлагаете запоминать name в массиве который зависнет как параметр анонимной функции внутри нового метода getName который переопределит makeWrap. Надо сказать это весьма и весьма хиро%опо :D setName можно реализовать также как в конструкторе: ... setName: function(newName) { this.makeWrap('getName',[newName]) }, ... Но ведь это ужасно :( получается прямого доступа к полю нейм нету даже внутри методов объекта. Во что у меня получилось из вашего кода (массивы убрал так как тут они не нужны): function log(a){alert(a)} function Human(name) { this.makeWrap("getName", name); } Human.prototype = { makeWrap: function (propertyName, args) { this[propertyName] = ( function(args) { return function() { return Human.prototype[propertyName](args); } } )(args) }, setName: function(newName) { this.makeWrap('getName',newName) }, getName: function(name) { return name; }, setLastName: function(LName) { this.makeWrap('getLastName',LName) }, getLastName: function(LName) { return LName }, getFullName: function() { return this.getName()+' '+this.getLastName(); } // ,constructor: Human } h1 = new Human("Владимир"); h2 = new Human("Дмитрий"); h1.setLastName('Путин'); log(h1.getFullName()) h2.setLastName('Медведев'); log(h2.getFullName()) h2.setName('Александр') log(h2.getFullName()) log('Протипы равны? '+(h1.__proto__ === h2.__proto__)) |
Mixxx, массивы будут удобны, если возникнет необходимость передавать больше одного параметра. Можно и в этом случае обойтись без массивов, но с ними проще.
|
Maxmaxmахimus, спасибо за ссылку, есть кое что полезное на заметку.
|
Приваты, судя по ECMA будут, и как я понял это будет private и объект x.
private key x.key // x для приватов вместо this |
Часовой пояс GMT +3, время: 05:05. |