Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как правильно передавать аргументы в прототипы (https://javascript.ru/forum/misc/64509-kak-pravilno-peredavat-argumenty-v-prototipy.html)

Maine 16.08.2016 18:35

Как правильно передавать аргументы в прототипы
 
Всем привет!
Нужно было создать функцию-класс Animal с методом getName, возвращающим name, потом второй класс Dog, который наследует от первого и имеет свой метод bark, возвращающий строку. Затем создать экземпляры класса Dog и применить к ним унаследованные от обоих классов методы. Вот что у меня получилось, выдает undefined. Не понимаю, как правильно передавать аргументы вот в этой строке: Dog.prototype = new Animal();
или проблема в чем-то другом...


function Animal(name) {
    this.getName = function() {
        return name;
    }
}


function Dog(dogname) {
    this.bark = function (dogname) {
        return ('Dog ' + dogname + ' is barking');
    }
}

Dog.prototype = new Animal();

var dog = new Dog('Balto');

console.log(dog.getName());
console.log(dog.bark());

nerv_ 16.08.2016 18:44

class Animal {
  constructor(name) {
  	this.name = name;
  }
}

class Dog extends Animal {
  constructor(name) {
  	super(name);
  }
  bark(dogName) {
  	return this.name + dogName;
  }
}


let dog = new Dog('Balto');
console.log(dog.name);
console.log(dog.bark('test'));

Maine 16.08.2016 18:57

Спасибо!
А средствами ES5 это сделать невозможно?

рони 16.08.2016 19:16

Maine,
function Animal(name) {
    this.name = name
}
Animal.prototype.getName =  function() {
        return this.name;
    }

function Dog(name) {
  this.name = name
  }

Dog.prototype = Animal.prototype;
Dog.prototype.bark = function () {
        return ('Dog ' + this.name + ' is barking');
    }
var dog = new Dog('Balto');

alert(dog.getName());
alert(dog.bark());

warren buffet 16.08.2016 19:39

рони, красава, теперь с любого конструируй

var dog = new Animal('Balto');

dog.bark();

/*
Dog Balto is barking
*/

warren buffet 16.08.2016 19:46

Вот хрестоматийное решение задачки ТС.

function Animal() {
    this.getName = function() {
        return this.name;
    }
}

function Dog(name){
    this.name=name;
    this.bark = function () {
       return ('Dog ' + this.getName() + ' is barking');
   }
}

Dog.prototype = new Animal();

var dog = new Dog('Balto');

dog.bark();

/*
Dog Balto is barking
*/


PS Три раза правил. Абстрактные задачи суксь и маздай.

рони 16.08.2016 19:49

warren buffet,
хотелось бы так
var dog = new Dog('Balto');

warren buffet 16.08.2016 19:56

рони, да я вообще не понял чего ему надо, поэтому правил живьем. Просто твое уравнивание протитипов - противозаконно. Родитель не может наследовать свойства и методы отпрыска. Ты поломал систему ниппель вот так Dog = Animal. На практие так можно делать, если так надо, а ему так не надо, он задание списать должен.

Vlasenko Fedor 16.08.2016 22:10

Наследование на классах. Функция extend
function extend(Child, Parent) {
	var F = function() { }
	F.prototype = Parent.prototype
	Child.prototype = new F()
	Child.prototype.constructor = Child
	Child.superclass = Parent.prototype
}

function Animal(name) {
	this.name = name;
}

Animal.prototype.getName = function() {
  return this.name;
}

function Dog(name){
	this.name = name;
}
extend(Dog, Animal);

Dog.prototype.bark = function () {
  return ('Dog ' + this.getName() + ' is barking');
}


var dog = new Dog('Balto');
console.log(dog.getName()); //Balto
console.log(dog.bark()); //Dog Balto is barking

warren buffet 17.08.2016 09:38

Еще один умнег продублировавший конструктор в обоих объедках.

Короч, смотри ТС как все делается.

var Animal = function(name){

   this.getName=function(){return name}; /* видишь без this */
  
};

var Dog = function(name){

    var an = new Animal(name);
    an.bark=function(){return ('Dog ' + an.getName() + ' is barking');};

    return an;

};

var dog = Dog('Balto');

dog.bark();
/*
Dog Balto is barking
*/


И по бороде всю эту тряхомудию с прототипами.

Критика профессоров приветствуется. )))

warren buffet 17.08.2016 09:42

Это значит ты не сможешь сделать mixin или treat, поскольку уже все внутри потомка прописано, а тебе они нужны - миксины?

Vlasenko Fedor 17.08.2016 10:48

Цитата:

Сообщение от warren buffet
Еще один умнег продублировавший конструктор в обоих объедках.

Че умник кто пишет extend(s) тот не прав.
А ну бегом учится, почти в каждой либе есть

warren buffet 17.08.2016 10:57

Тебе говорят что животное, должно быть таким

function Animal() {}

и тогда твой экстенд вырождается в сущую тавтологию.

У меня нет ни одной либы.

nerv_ 17.08.2016 11:11

Цитата:

Сообщение от рони (Сообщение 425667)
Maine,
function Animal(name) {
    this.name = name
}
Animal.prototype.getName =  function() {
        return this.name;
    }

function Dog(name) {
  this.name = name
  }

*!*Dog.prototype = Animal.prototype;*/!*
Dog.prototype.bark = function () {
        return ('Dog ' + this.name + ' is barking');
    }
var dog = new Dog('Balto');

alert(dog.getName());
alert(dog.bark());

вместо выделеной строки
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

http://javascript.ru/forum/offtopic/...kriptorov.html

а, вообще, делайте через es6 и не мучайтесь

Vlasenko Fedor 17.08.2016 11:12

Цитата:

Сообщение от warren buffet
У меня нет ни одной либы.

Тогда вам сюда
Каждый программист на javascript должен написать свою реализацию классов.

рони 17.08.2016 11:26

nerv_,
:thanks:

warren buffet 17.08.2016 15:15

Poznakomlus, по моему гавномеру хабр стоит по горло после гитхаба, который стоит по пояс. Такшта не полезу.

warren buffet 17.08.2016 15:26

И эта тема крутится вокруг культа классов. Они когда нужны, тогда и нужны, а чаще всего нафиг не нужны, и не нужна никакая эмуляция, поскольку в жабе запросто делается то, что в каноничных языках задолбаешься оформлять, собирать и проверять. Это же веб, а не десктоп и не сервер, а клиент.

Ну поменяй метод в классе контроллера в зависимости от типа запроса на том же вебном php скажем. А на жабе можно смастерить объект в зависимости от любых условий, потом поменять еще раз от условий и так далее и он будет молотить пока страница не переплывет реку Стикс.

Это все происки десктопных программистов, тащат за собой настольный опыт на веб и создают свою культуру и культы. )))

Vlasenko Fedor 17.08.2016 16:07

Цитата:

Сообщение от warren buffet
в зависимости от типа запроса на том же вебном php скажем

это же роутер в php

define('METHOD', $_SERVER['REQUEST_METHOD']);
define('URI', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));

function router($url, ...$args)
{
    (empty($args[1]) || false !== strpos(METHOD, $args[0]))
    && (URI === $url || preg_match('#^' . $url . '$#iu', URI, $match))
    && die(call_user_func_array(end($args), $match ?? []));
}

router('/', function () {
    echo 'Main Micro';
});

кроме того есть reflection, а вот классы для разнообразия стоило глянуть :)

warren buffet 17.08.2016 17:27

Poznakomlus, ты можешь для разнообразия посмотреть сериал Гадалка или там Мент в законе? Ну вот, у меня такое чувство к хабрам и гитам.

Цитата:

Сообщение от Poznakomlus
есть reflection,

Об чем и речь, reflection есть.

Цитата:

Сообщение от Poznakomlus
call_user_func_array

И call_user_func_array есть.

А на жабе ничего этого не надо.

if(a)
  obj.method = one;
else
  obj.method = two;


и пользуйся всю дорогу больше ничего не проверяя. Понял?

Vlasenko Fedor 17.08.2016 18:27

Цитата:

Сообщение от warren buffet
Понял?

Нет, так в пыхе можно так-же написать подобно
function test($a)
{
  $obj = new stdClass();
  $one = function () use ($a) {
    var_dump($a);
    echo 'One', PHP_EOL;
  };
  $two = function () use ($a) {
    var_dump($a);
    echo 'Two', PHP_EOL;
  };
  // ваш код
  if ($a)
    $obj->method = $one();
  else
    $obj->method = $two();

  return $obj;
}

test(true)->method; //bool(true), One 
test(false)->method; //bool(false), Two
или так
function test($a)
{
		$obj = new stdClass();
		$one = function ($value) use ($a)
		{
				var_dump($a, $value);
				echo 'One', PHP_EOL;
		};
		$two = function ($value) use ($a)
		{
				var_dump($a, $value);
				echo 'Two', PHP_EOL;
		};
		// ваш код
		if ($a)
		{
				$obj->method = $one;
		}
		else
		{
				$obj->method = $two;
		}

		return $obj;
}

(test(true)->method)('ya');
(test(false)->method)('hi');

ведь то-же красивый язык

warren buffet 18.08.2016 11:33

Цитата:

Сообщение от Poznakomlus
$obj = new stdClass();


Ты крут, чо. Ты хоть знаешь что такое stdClass? Не парься, я расскажу. Это array, и даже не ArrayObject, а просто array c доступом к элементам по -> Ну то есть теперь тебе надо дописать интерфейсы наследования через какой-нибудь элемента массива с именем типа prototype и все такое, чтобы сделать из этого stdClass что-то похожее на js объект.

warren buffet 18.08.2016 11:47

И вообще не сравнивай х с пальцем. Поэтому я не применяю .prototype, из-за его изоляции от контекста, в котором можно сказать вся милота жабы скрипучей. А чтобы зохавать контекст в php - это надо передавать this в анонимную функцию и, вроде новые версии это умеют, но опять же через ж.

Vlasenko Fedor 18.08.2016 14:00

Цитата:

Сообщение от warren buffet
Ты крут, чо

Да, вижу что и ты признал :lol:
Цитата:

Сообщение от warren buffet
Ты хоть знаешь что такое stdClass

Иногда пишу свои расширения под пых по надобности :)
Цитата:

Сообщение от warren buffet
Ну то есть теперь тебе надо дописать

Мне ничего не надо. Ты описываешь свое видение.
Цитата:

Сообщение от warren buffet
А чтобы зохавать контекст в php - это надо передавать this в анонимную функцию

Вам сюда http://php.net/manual/ru/closure.bind.php
Не надо из php делать js
У каждого языка есть свое назначение

warren buffet 18.08.2016 14:47

Цитата:

Сообщение от Poznakomlus
У каждого языка есть свое назначение

Например у русского языка назначение молоть чушь. А у английского языка назначение - информировать. Согласен.

warren buffet 18.08.2016 19:11

Одни клованы на форуме остались блин и, по-моему, никакой надежды что цирк сюда вернется. Было бы смешно, если бы не было печальки.


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