Duck Typing в Javascript

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

Ответ 1

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

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

Википедия - Дайка набрав

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

Интерфейсы JavaScript и Duck Typing

Ответ 2

Правило " Duck Typing"

Если это похоже на утку, плавает, как утка, и шарлатанцы, как утка, то это, вероятно, утка.

В объектно-ориентированном языке программирования на языке класса (например, С++), чтобы оба объекта выглядели как утка, вы должны наследовать их классы из общего класса "интерфейса", поэтому компилятор разрешил вам называть 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 для обоих объектов (и кто волнует, каковы они есть на самом деле).

Ответ 3

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

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

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

for (let value of iterable) {
}

и массивы

[...iterable]