как обратиться к родному методу конструктора, после его переопределения
Не знаю насколько правильно задал вопрос, буду благодарен любой помощи, и возможно ещё каким-то человеческим объяснениям наследования в 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, время: 15:17. |