У меня есть класс 2: животное (родительское) и собака ("ребенок" животного), когда я создаю объект "Животное" и пытаюсь предупредить имя животного, я получил неопределенное имя, а не ее настоящее имя. Зачем? (извините за двойной пост)
function Animal(name, year){
alert(name);
this.name = name;
this.year = year;
this.age = function (){
var n = new Date().getFullYear();
return n - this.year;
};
}
function Dog(name, year, color, type) {
this.color = color;
this.type = type;
Animal.call(this, name, year);
//override method age of animal
this.age = function (){
var n = new Date().getFullYear();
return (n - this.year) * 7;
};
Dog.prototype.age();
}
Dog.prototype = new Animal();
(Этот класс js называется: /JsClass.js)
и в HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="/JsClass.js"></script>
<script type="text/javascript">
var p1 = new Animal("rex",2008);
</script>
<title>Insert title here</title>
</head>
<body>
</body>
</html>
(с использованием Eclipse)
Спасибо!
function Animal(name , year){
alert(name);
this.name = name;
this.year=year;
this.age= function (){
var n= new Date().getFullYear();
return n-this.year;
};
}
function Dog(name , year , color , type) {
this.color=color;
this.type=type;
Animal.call(this, name,year);
//override method age of animal
this.age= function (){
var n= new Date().getFullYear();
return (n-this.year)*7;
};
Dog.prototype.age();
}
// you invoke Animal as constructor. but you did not pass any argument to it . so name any year will be undefined in Animal() so alert will show undefined
Dog.prototype = new Animal();
// here is the normal invoke so alert will show rex
var p1 = new Animal("rex",2008);
ваш код будет дважды ссылаться на Animal, первый invoke alert undefined и второй alert rex
когда я создаю объект Animal, и пытаюсь предупредить имя животного, я получил неопределенное, а не ее настоящее имя
Функция оповещения находится в функции конструктора животного. Вы не передали ничего в эту функцию, когда вы создали экземпляр его как прототип собаки.
Вот что происходит:
Dog.prototype = new Animal();
вызывает функцию конструктора без каких-либо параметров (отсюда неопределенное предупреждение) и устанавливает прототип собаки в экземпляр Animal.
new Animal("rex", 2008);
снова вызывает конструктор. На этот раз с именем, так что вы получите "rex".
Я рекомендую установить методы как свойства прототипа. Таким образом, функции не создаются на каждом экземпляре. Я бы изменил ваш код так:
function Animal(name, year) {
this.name = name;
this.year = year;
};
Animal.prototype.age = function() {
var n = new Date().getFullYear();
return n - this.year;
};
function Dog(name, year, color, type) {
Animal.call(this, name, year);
this.color = color;
this.type = type;
};
// Override method age of animal
Dog.prototype.age = function() {
var n = new Date().getFullYear();
return (n - this.year) * 7;
};
Dog.prototype = new Animal();
Но есть еще одна проблема - вы дважды вызываете конструктор Animal. Когда вы установите его как прототип Dog, а другой, когда вы делаете Animal.call()
. Один из способов этого - использовать метод наследования Крокфорда.
В
Dog.prototype = new Animal();
Вы выполняете Animal() без параметров. И его ОК для имитации наследования в javascript.