Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Наследование классов (https://javascript.ru/forum/css-html/49270-nasledovanie-klassov.html)

Panamaster 05.08.2014 15:54

Наследование классов
 
Написать класс Cat, который наследуется от класcа Animal. Класс Animal имеет метод getName (name можно передать в конструктор). Класс Cat имеет метод meow (возвращает строку «Cat {catname} is sayig meow».
Пример использования:
$cat = new Cat(‘garfield’);
$cat->getName() === ‘garfield’ // true
$cat->meow() === ‘Cat garfield is saying meow’ // true

руководствуясь статьей учебника написал код, который не работает
var animal = { };
 
animal.getName = function(name) {
  this.name = cat.name;
};
      
var cat = new cat('Garfield'); 
  
      
cat._proto_ = animal;
     
     cat.meow = function() {
  return "Cat" + this.name + "is saying meow";
};
 
alert( cat.meow );


Буду благодарен если укажете на ошибки и поможете сделать правильно

ixth 05.08.2014 20:23

Цитата:

Написать класс Cat, который наследуется от класcа Animal.
Чтобы написать "класс", нужно прежде всего написать конструктор, т.е. функцию, которая создает объект. У тебя ее нет.
Тебе надо хотя бы что-то типа этого:

function Cat(name) {
    // Тут надо инициализировать объект
}

Cat.prototype = Object.create(Animal.prototype);
// На худой конец — Cat.__proto__ = Animal.__proto__;


У тебя же это:

/*
1. Вызываем функцию cat (которой не существует)
2. Результат кладем в переменную cat.
3. При попытке вызова п. 1 js ищет ф-цию cat, но находит неинициализированную перменную cat.    
*/
var cat = new cat('Garfield'); 

/*
Никто так не делает, потому что этот способ устарел и не везде работает.
Но если используешь наследование через __proto__, то пиши его правильно (с двумя подчеркиваниями в начале и конце).
*/
cat._proto_ = animal;

/*
В принципе, это будет работать. Но лучше cat.__proto__.meow
*/
cat.meow = function() {
	return "Cat" + this.name + "is saying meow";
};


Цитата:

руководствуясь статьей учебника написал код, который не работает
Статьей про prototype? Отдохни. Погуляй. Попей чаю. Перечитай.

Sweet 05.08.2014 21:12

Цитата:

Сообщение от ixth
Cat.prototype = Object.create(Animal.prototype);
// На худой конец — Cat.__proto__ = Animal.__proto__;

Вообще-то, разница огромная.
Во-первых,
Cat.__proto__ ===  Function.prototype && Animal.__proto__ ===  Function.prototype

Во-вторых, прототип функции-конструктора не влияет на экземпляры.
Цитата:

Сообщение от Panamaster
руководствуясь статьей учебника написал код, который не работает

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

ixth 05.08.2014 21:19

Цитата:

Сообщение от Sweet (Сообщение 324471)
Вообще-то, разница огромная.
Во-первых,
Cat.__proto__ ===  Function.prototype && Animal.__proto__ ===  Function.prototype
Во-вторых, прототип функции-конструктора не влияет на экземпляры.

Ну, не подумал, с кем не бывает. В любом случае, можно на готовых объектах установить __proto__ в Animal.prototype (если он правильный).

Griisha 06.08.2014 10:09

// Так я думаю можно?
function Animal() {
animal.getName = function(name) {
this.name = cat.name;
};
function Cat() {}

extend(Cat, Animal)

Cat.prototype.meow = function(..) {
cat.meow = function() {
return "Cat" + this.name + "is saying meow";
};

alert( cat.meow );
}

Sweet 06.08.2014 10:32

Griisha, чё за х**ню ты тут написал? И спасибо, что зарегился, а то без твоих бредней, форум был совсем не торт!

kaflan 16.11.2014 00:51

тема жива еще?
 
вот думаю єто заданиесделать кто то проверит код?

krutoy 16.11.2014 01:53

Для такой параши достаточно вот этого:
Animal={}
Cat=Object.create(Animal)
Cat.meow=function(){return "Cat "+this.name+" is saying meow"}
cat=Object.create(Cat)
cat.name="Garfield"
alert(cat.meow())

kaflan 16.11.2014 02:01

Ну знаешь новичку трдно найти таск. тем более такой для менятрудній
 
Цитата:

Сообщение от krutoy (Сообщение 341101)
Для такой параши достаточно вот этого:
Animal={}
Cat=Object.create(Animal)
Cat.meow=function(){return "Cat "+this.name+" is saying meow"}
cat=Object.create(Cat)
cat.name="Garfield"
alert(cat.meow())

спасибо но я свое зафигачу. для начинающего сам смак

krutoy 16.11.2014 02:16

kaflan,
Собственно, там, в твоем юзкейсе, класс Animal вообще не нужен. Он может понадобиться, только если в дальнейшем собираешься расширять. Вот в таком, например случае, он действительно нужен
Animal={
  say: function(){return this.kind +" "+ this.name + " saying "+this.word}
}
Cat=Object.create(Animal)
Cat.kind="Cat"
cat=Object.create(Cat)
cat.name="Garfield"
cat.word="meow"

Dog=Object.create(Animal)
Dog.kind="Dog"
dog=Object.create(Dog)
dog.name="Huy"
dog.word="gav"

alert(cat.say()+"\n"+dog.say())


Часовой пояс GMT +3, время: 17:27.