JavaScript - Наследование

0

У меня есть класс 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)

Спасибо!

  • 0
    Для справки, вы обычно вызываете родительский конструктор перед настройкой собственных полей, а не после. Однако не должно вызывать проблемы, которую вы видите.
  • 0
    Теперь я вижу, что если я удалю эту строку: Dog.prototype = new Animal (); это бдительное имя животного. так в чем проблема с этой линией? где я должен это положить?
Теги:

3 ответа

1
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

1

когда я создаю объект 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(). Один из способов этого - использовать метод наследования Крокфорда.

  • 0
    Благодарю. но какие параметры я должен вставить в эту строку: Dog.prototype = new Animal ('wow'); ?
  • 1
    Должно быть просто Dog.prototype = new Animal ();
0

В

Dog.prototype = new Animal();

Вы выполняете Animal() без параметров. И его ОК для имитации наследования в javascript.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню