Как правильно передавать аргументы в прототипы
Всем привет!
Нужно было создать функцию-класс 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());
|
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'));
|
Спасибо!
А средствами ES5 это сделать невозможно? |
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());
|
рони, красава, теперь с любого конструируй
var dog = new Animal('Balto');
dog.bark();
/*
Dog Balto is barking
*/
|
Вот хрестоматийное решение задачки ТС.
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 Три раза правил. Абстрактные задачи суксь и маздай. |
warren buffet,
хотелось бы так
var dog = new Dog('Balto');
|
рони, да я вообще не понял чего ему надо, поэтому правил живьем. Просто твое уравнивание протитипов - противозаконно. Родитель не может наследовать свойства и методы отпрыска. Ты поломал систему ниппель вот так Dog = Animal. На практие так можно делать, если так надо, а ему так не надо, он задание списать должен.
|
Наследование на классах. Функция 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
|
Еще один умнег продублировавший конструктор в обоих объедках.
Короч, смотри ТС как все делается.
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
*/
И по бороде всю эту тряхомудию с прототипами. Критика профессоров приветствуется. ))) |
Это значит ты не сможешь сделать mixin или treat, поскольку уже все внутри потомка прописано, а тебе они нужны - миксины?
|
Цитата:
А ну бегом учится, почти в каждой либе есть |
Тебе говорят что животное, должно быть таким
function Animal() {} и тогда твой экстенд вырождается в сущую тавтологию. У меня нет ни одной либы. |
Цитата:
Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; http://javascript.ru/forum/offtopic/...kriptorov.html а, вообще, делайте через es6 и не мучайтесь |
Цитата:
Каждый программист на javascript должен написать свою реализацию классов. |
nerv_,
:thanks: |
Poznakomlus, по моему гавномеру хабр стоит по горло после гитхаба, который стоит по пояс. Такшта не полезу.
|
И эта тема крутится вокруг культа классов. Они когда нужны, тогда и нужны, а чаще всего нафиг не нужны, и не нужна никакая эмуляция, поскольку в жабе запросто делается то, что в каноничных языках задолбаешься оформлять, собирать и проверять. Это же веб, а не десктоп и не сервер, а клиент.
Ну поменяй метод в классе контроллера в зависимости от типа запроса на том же вебном 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, а вот классы для разнообразия стоило глянуть :) |
Poznakomlus, ты можешь для разнообразия посмотреть сериал Гадалка или там Мент в законе? Ну вот, у меня такое чувство к хабрам и гитам.
Цитата:
Цитата:
А на жабе ничего этого не надо. if(a) obj.method = one; else obj.method = two; и пользуйся всю дорогу больше ничего не проверяя. Понял? |
Цитата:
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');
ведь то-же красивый язык |
Цитата:
Ты крут, чо. Ты хоть знаешь что такое stdClass? Не парься, я расскажу. Это array, и даже не ArrayObject, а просто array c доступом к элементам по -> Ну то есть теперь тебе надо дописать интерфейсы наследования через какой-нибудь элемента массива с именем типа prototype и все такое, чтобы сделать из этого stdClass что-то похожее на js объект. |
И вообще не сравнивай х с пальцем. Поэтому я не применяю .prototype, из-за его изоляции от контекста, в котором можно сказать вся милота жабы скрипучей. А чтобы зохавать контекст в php - это надо передавать this в анонимную функцию и, вроде новые версии это умеют, но опять же через ж.
|
Цитата:
Цитата:
Цитата:
Цитата:
Не надо из php делать js У каждого языка есть свое назначение |
Цитата:
|
Одни клованы на форуме остались блин и, по-моему, никакой надежды что цирк сюда вернется. Было бы смешно, если бы не было печальки.
|
| Часовой пояс GMT +3, время: 18:06. |