LINUX.ORG.RU

В чем затык

 


0

2

Консоль хрома говорит что у City __proto__ World, но должно ведь быть Country? Хотя работает все нормально

<html>

    <body>

    <script>
        function World(){
            this.x = 1;
        }

        function Country(){
            this.y = 1;
        }


        function City(){
            this.z = 1;
        }

        Country.prototype = new World;
        City.prototype = new Country();

        console.log(new City);
    </script>

    </body>

</html>

★★★★
 Country.prototype = new World

Прототипом для Country становится экземпляр World

City.prototype = new Country();

Создается Country у которого в качестве прототипа уже установлен World (тоесть по сути берется World) и устанавливается в качестве прототипа для City

zaz ★★★★
()
Ответ на: комментарий от gobot

А что собственно нужно сделать ? Наследование на прототипах ? Я обычно пользуюсь вот таким подходом:

function extendObject(dst, src)
{
    var k;
    for(k in src)
    {
        dst[k] = src[k];
    }
}

function World()
{
   this.x = 1;
}

function Country()
{
   this.World();
   this.y = 1;
}
extendObject(Country.prototype, World.prototype);
Country.prototype.World = World;

function City()
{
  this.Country();
  this.z = 1;
}
extendObject(City.prototype, Country.prototype);
City.prototype.Country = Country;
Выглядит конечно не очень на простых примерах, зато полная свобода действий и работает везде

zaz ★★★★
()
Ответ на: комментарий от zaz

Охота что б в консоле вывод был адекватный

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Я бы взял ts и использовал наследование.

Shadow ★★★★★
()

Вот так проверь:

console.log(city instanceof City && city instanceof Country && city instanceof World); // true

Я бы не заморачивался

anonymous
()
Ответ на: комментарий от Shadow

Какая разница он транслируется в тот же JS. Тем более не смотря на ор в TS еще более тупой тайпчеккер, нежели в Google closure compiler или в flow.

Deleted
()
Ответ на: комментарий от icefreeze

Бери затычку от Vit'а, это рассово правильная реализация наследования. Instanceof будет нормально отрабатывать, он проходит всю цепочку прототипов, так что будет true и на родительский класс и на конкретный.

Deleted
()
Ответ на: комментарий от Vit

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

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Ну ты вместо наследования написал ересь. Почему хром ее отображает именно так, мне думать лень. Тебе было предложено как исправить, и с костылями и без. Если это не то что тебе полезно - извини.

Vit ★★★★★
()
Ответ на: комментарий от gobot

Наследование - это по ссылке что я давал, или class B exdends A если es6.

А ты там даже не класс, а инстанс на прототип пришурупить пытался.

Vit ★★★★★
()

В чем затык

С точки зрения ООП ты написал ерунду. Почему у тебя город наследуется от страны, а та — от мира?
С точки зрения программного кода Хром тебе говорит именно то, что ты и написал. В программировании всегда так: хочешь, чтобы конпутер что-то вычислил — напиши соответствующий код, а напишешь ерунду, он ерунду и вычислит.

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.