2013-11-25 6 views
0

У меня есть класс 2: животное (родитель) и собака («ребенок» животного), , когда я создаю объект Animal, и пытаюсь предупредить имя животного, Я получил неопределенный, а не ее настоящее имя. Зачем? (жаль двойной пост)JavaScript - Наследование

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

Для справки обычно вы вызываете родительский конструктор перед установкой собственных полей, а не после. Однако не следует вызывать проблему, которую вы видите. – cHao

+0

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

ответ

1

когда я создаю объект животного и попытаться предупредить название животного, я не определен, а не ее настоящее имя

Ваша функция предупреждения в функции конструктора животных. Вы не передали ничего в эту функцию, когда вы создали экземпляр прототипа Dog.

Вот что происходит:

Dog.prototype = new 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(); 

Но есть еще одна проблема - вы вызываете конструктор животных дважды. Однажды, когда вы установите его как прототип Dog, а другой, когда вы делаете Animal.call(). Один из способов этого - использовать method of inheritance от Crockford.

+0

спасибо. но какие параметры я должен вставить в эту строку: Dog.prototype = new Animal ('wow'); ? – user2097810

+1

Должен просто быть Dog.prototype = new Animal(); – linstantnoodles

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); 

ваш код будет ссылаться на животное дважды, первый Invoke предупреждение неопределенными и второе предупреждение рекс

0

В

Dog.prototype = новый Animal();

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

Смежные вопросы