2016-05-28 2 views
0

Я изучаю наследование javascript в первый раз, и, похоже, я не могу заставить его работать, или, может быть, я не понимаю его правильно. Поэтому у меня есть некоторый код здесь, давайте посмотрим на нее:Как реализовать наследование javascript

<script language="javascript" type="text/javascript">    
      //object and prototype 
      function cat(name){//object constructor 
       this.name = name;//property 
       this.talk = function(){//method 
        console.log(this.name + " say meeow"); 
       } 
      }   
      cat1 = new cat("Cat 1 Felix") 
      cat1.talk();    
      cat2 = new cat("cat 2 Joy") 
      cat2.talk() 
      //inheritance 
      function isleManCat(name){ 
       cat.call(this,name) 
       this.feature = "no tail" 
       this.detail = function(){ 
        console.log(this.name + " has " + this.feature); 
       } 
      } 
      isleManCat.prototype = new cat(); 
      cat3 = new isleManCat("isle of Man cat") 
      cat3.talk(); 
      cat3.detail();   
     </script> 

Так что у меня 2 кошки объектов здесь и cat1 и CAT2 печатает ожидаемые результаты:

Cat 1 Felix say meeow 
cat 2 Joy say meeow 

. Тогда cat3 является isleOfMan() кошкой, которая должна унаследовать от кошки(), и я бы подумал, что это будет наследовать имущество имени от кошки(), но он печатает неопределенным:

undefined say meeow 
undefined has no tail 

Может кто-нибудь любезно дайте мне знать почему это не работает и что я делаю неправильно, потому что, похоже, я не понимаю этого? Благодаря

+1

Какое имя вы ожидаете кота иметь? – Amit

+1

Вы никогда не указали имя для своего 'isleManCat' для начала. – RainingChain

+1

'isleManCat()' необходимо вызвать унаследованный конструктор. Есть тысячи руководств по наследованию в Javascript и сотни ответов здесь на ту же тему. Пожалуйста, прочитайте, а затем задайте гораздо более конкретный вопрос, когда вы застряли. Мы не являемся универсальной учебной службой, когда вы не проводили никаких исследований. Например, запустите [здесь] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain). – jfriend00

ответ

1

Ваш третий котенок получения cat не даст свой ожидаемый результат, поскольку cat конструктор не будет вызван isleManCat «s конструктор автоматического волшебно! И ваш третий котенок не имеет имени вообще!

 // You need to pass the name of the whole cat to this constructor 
     // to later give it as argument to base constructor (i.e. cat()) 
     function isleManCat(name){ 
      // This is calling cat constructor function setting the "this" 
      // keyword to the "this" of isleManCat 
      cat.call(this, name); 

      this.feature = "no tail" 
      this.detail = function(){ 
       console.log(this.name + " has " + this.feature); 
      } 
     } 

В 5.x ECMA-Script вы также можете использовать Function.prototype.apply и arguments зарезервированное ключевое слово, чтобы передать isleOfMan аргументы конструктору в качестве массива в cat:

 function isleManCat(){ 
      cat.apply(this, arguments); 

      this.feature = "no tail" 
      this.detail = function(){ 
       console.log(this.name + " has " + this.feature); 
      } 
     } 

И, в ECMA-Script 2015 и выше вы можете использовать остальные параметры:

 function isleManCat(...args){ 
      // This is calling cat constructor function setting the "this" 
      // keyword to the "this" of isleManCat 
      cat.apply(this, args); 

      this.feature = "no tail" 
      this.detail = function(){ 
       console.log(this.name + " has " + this.feature); 
      } 
     } 
Смежные вопросы