Утка, набрав в Javascript - PullRequest
50 голосов
/ 31 июля 2010

Может ли кто-нибудь дать мне пример наследования Duck Typing в Javascript? Я изучаю OO javascript и слышал о типизации утки, но не вижу никаких примеров ее использования в javascript.

Ответы [ 3 ]

122 голосов
/ 01 августа 2010

Правило " Duck Typing " такое:

Если оно выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, утка,

В объектно-ориентированном языке программирования на основе классов (например, C ++), чтобы оба объекта выглядели как утка, вы должны наследовать их классы от общего класса "interface", чтобы компиляторпозвольте вам вызывать duck методы для них.Это называется строгой типизацией.

Вот как это делается в Javascript:

var duck = {  
    appearance: "feathers",  
    quack: function duck_quack(what) {  
        print(what + " quack-quack!");  
    },  
    color: "black"  
};

var someAnimal = {  
    appearance: "feathers",  
    quack: function animal_quack(what) {  
        print(what + " whoof-whoof!");  
    },  
    eyes: "yellow"  
};  

function check(who) {  
    if ((who.appearance == "feathers") && (typeof who.quack == "function")) {  
        who.quack("I look like a duck!\n");  
        return true;  
    }  
    return false;  
}  

check(duck);  // true
check(someAnimal);  // true

Видите, функция check проверяет, выглядит ли переданный объект как утка (он проверяет внешний вид и его способность крякать)).Мы передаем ему два разных объекта, и он вернет true на обоих.Помимо внешнего вида и кряка это могут быть совершенно разные вещи, но В ЭТОЙ ОСОБЕННОСТИ check они ведут себя одинаково (имеют общий интерфейс), они оба выглядят как «утка».Мы можем вызвать метод quack для обоих объектов (и кого это волнует).

25 голосов
/ 31 июля 2010

Во второй ссылке приведен пример шаблона, подобного утиной, в js. Не говорю, что я рекомендую это сделать, но ... ну, вы просили об этом. ;)

В компьютерном программировании с объектно-ориентированные языки программирования, типирование утки - это стиль динамического набрав в котором текущий объект набор методов и свойств определяет действительную семантику, а чем его наследование от конкретного класс или реализация конкретного интерфейс.

Википедия - Утка набирает

Простейший подход - определить Контракт неофициально и просто полагаться на разработчики на каждой стороне интерфейс, чтобы знать, что они делают. Дейв Томас дал такой подход название «утки печатать» - если она ходит как утка и крякает как утка, тогда это утка. Аналогично с нашими Shape интерфейс, если он может вычислить площадь и периметр, то это Shape.

Интерфейсы JavaScript и набор утилит

4 голосов
/ 28 ноября 2017

Примером написания утки в JavaScript являются iterables .У JavaScript на самом деле нет типа с именем Iterable, но у него есть определение объекта, который является итеративным.

Чтобы быть итеративным, объект должен реализовывать метод @@ iterator

Это требование для печати утки.Если объект реализует метод, определенный в интерфейсе, объект можно использовать в местах, где принят тип интерфейса.Для итераций это имеет место в циклах

for (let value of iterable) {
}

и массивах

[...iterable]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...