как обратиться к родному методу конструктора, после его переопределения
Не знаю насколько правильно задал вопрос, буду благодарен любой помощи, и возможно ещё каким-то человеческим объяснениям наследования в js :)
function Animal(obj){ this.name = obj.name; this.age = obj.age; this.al = function(){ alert(this.name + ' живут ' + this.age + ' лет'); } } var dog = new Animal({name:'dog', age: 15}); dog.al(); // dog живут 15 лет dog.al = function(){ alert(this.name + ' живут ' + (this.age+10) + ' лет'); } dog.al(); // dog живут 25 лет код здесь http://jsfiddle.net/upxtw8j6/3/ можно ли как то вызвать родной метод al() из Animal, не создавая нового объекта new Animal? то есть что бы опять вывелось 15 лет. |
function Animal(obj){ this.name = obj.name; this.age = obj.age; this.al = function(){ alert(this.name + ' живут ' + this.age + ' лет'); } } var dog = new Animal({name:'dog', age: 15}); dog.al(); var me = dog.al; dog.al = function(){ alert(this.name + ' живут ' + (this.age+10) + ' лет'); } dog.al(); me.apply(dog);:) |
Тебе не понятно что происходит в конструкторе по этому ты задаешь такой вопрос.
this.name, this.age, this.al - это просто переменные которые создаются при вызове конструктора если ты из изменишь то естественно не сможешь обратится к их старому значению. |
var me = dog.al; Спасибо, хороший вариант, но я думал может есть какой-то вариант обратится через прототип, конструктор или ещё как-то... Кстати может изначально я должен был метод по другому переопределять? |
Цитата:
Но может можно как-то вытащить родной метод из конструктора? |
Конструктор это просто функция которая возвращает объект и ничего больше в принципе невозможно получить какую то ее часть. зато ты можешь делать со свойствами построенного(сконструиров нного) объекта все что хочешь. даже сохранить эти свойства в отдельные переменные.
Кстати наличие функции в конструкторе будет приводить к замыканию при каждом вызове конструктора. |
Спасибо за хорошее объяснение.
Цитата:
но тут я не пойму, что именно будет в этом замыкании, и плохо это или хорошо? на что влияет? Может у вас как у опытного специалиста есть простые правила, когда замыкание появляется, и как его избежать, или наоборот использовать в мирных целях... Мне вот например понравилось: "|| запинается на «правде», && запинается на «лжи»." Было бы что-то такое про замыкания, было бы хорошо :) |
Цитата:
function Animal(obj){ this.name = obj.name; this.age = obj.age; } Animal.prototype={ age: 0, name: "noname", al: function(){ alert(this.name + ' lives ' + this.age + ' years'); } } var dog = new Animal({name:'dog', age: 15}); dog.al() dog.al = function(){ alert(this.name + ' lives ' + (this.age+10) + ' years'); } dog.al() Animal.prototype.al() // ::: dog lives 15 years // ::: dog lives 25 years // ::: noname lives 0 years А лучше без сахара: Animal={ name: "noname", age: 0, create: function(name, age){ var o=Object.create(this) o.name=name o.age=age return o }, al: function(){alert(this.name+" lives "+this.age+" years." )} } dog=Animal.create("dog", 15) dog.al() dog.al=function(){alert(this.name+" lives "+(this.age+10)+" years." )} dog.al() Animal.al() Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 12:18. |