Утиный ввод в JavaScript

Кто-то мог дать мне пример Утки, Вводящей наследование в JavaScript? Я исследую OO JavaScript, и я услышал об утином вводе, но не вижу примеров его используемый в JavaScript.

49
задан Mike Rifgin 31 July 2010 в 08:33
поделиться

2 ответа

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

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

Википедия - Утиная печать

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

Интерфейсы JavaScript и утиный ввод

25
ответ дан 7 November 2019 в 11:18
поделиться

Правило "Duck Typing" гласит:

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

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

Вот как это сделано в 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 на обоих объектах (и кому какое дело, что они на самом деле из себя представляют).

123
ответ дан 7 November 2019 в 11:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: