Не по каждой, а только те, которые нужны. И потом других ведь вариантов нет для динамических языков.
|
Знание о том, наличие каких функций надо проверять, где будет сосредоточено?
|
Сосредоточить в таком виде
function IDisposable() { this.Dispose = function() {}; } function isImplemented(classType, interfaceType) { // и тут бегаем по членам interfaceType проверяя есть ли они в classType } |
Понятно, т.е. отдельный объект под "интерфейс". Кстати, а сигнатуры методов проверятся будут? Если да, то как?
|
Цитата:
|
Цитата:
|
Цитата:
|
Ставлю на Kolyaj!:yes:
|
B~Vladi,
давайте подождем. Так хочется увидеть реализацию интерфейсов в js (-: |
Цитата:
Цитата:
Аргументы в пользу я так понимаю были отброшены как не значимые? |
Цитата:
Читайте чужой код на JavaScript. Посмотрите как реализованы известные фреймворки, ExtJS, например. JQuery не смотрите, там чёрт ногу сломит. |
Цитата:
Цитата:
но если вы знаете задачи, в которых нужны интерфейсы (в контексте js)... я всегда открыт для новых знаний ;) |
а про typeof мне приходит в голову только выполнение разных действий в зависимости от типа аргументов
function $( id ){ return typeof id == 'string' ? document.getElementById(id) : id; } в конце концов присутствие чего-либо в языке ничего не означает. Вспомнить хотя бы The Good Parts Дугласа Крокфорда |
Цитата:
Первый оператор позволяет отличить примитивные типы от объектов. Второй - чтобы отличить один тип объекта от другого. Этого достаточно, чтобы работать с языком, использовать всю его мощь и не думать об интерфейсах. Есть некоторые "казусы", о которых надо просто помнить. Например: Код:
typeof null == 'object' |
kidar2,
sysif, Решает ли этот код проблему отсутствия интерфейсов? Источник - http://javascript.ru/forum/66098-post2.html Object.mixin = function(dst /*, arg1, arg2... */) { for (var i = 1; i < arguments.length; i++) { for (var prop in arguments[i]) { if ( arguments[i].hasOwnProperty(prop) ) { dst[prop] = arguments[i][prop]; } } } return dst; } Function.prototype.inherit = function(proto) { var that = this; proto = proto || {}; var constructor = proto.hasOwnProperty('constructor') ? proto.constructor : function() { that.apply(this, arguments); }; var F = function() {}; F.prototype = this.prototype; // Оригинальная строка источника //constructor.prototype = mixin(new F(), proto); var dst = Object.mixin(new F(), proto); for (var i = 1; i < arguments.length; i++) { if ( ! arguments[i] ) { continue; } for (var p in arguments[i].prototype) { if ( ! arguments[i].prototype.hasOwnProperty(p) ) { continue; } if ( typeof arguments[i].prototype[p] == 'function' && typeof dst[p] != 'function' ) { throw new ReferenceError('"' + p + '" method is not implemented'); } } } constructor.prototype = dst; constructor.superclass = this.prototype; constructor.prototype.constructor = constructor; return constructor; }; // Глобальный интерфейс - родитель всех остальных интерфейсов var Interface = Object.inherit({ constructor: function() { throw new ReferenceError('An object could not be instantiated from an interface'); } }); // Интерфейс - Перемещаемые объекты var IMovable = Interface.inherit({ move: function() {} }); // интерфейс - Рисуемые объекты var IDrawable = Interface.inherit({ draw: function() {} }); // Класс Точка // реализует интерфейсы Перемещаемые, Рисуемые // но не реализует все методы интерфейсов // поэтому будет брошено исключение var Point = Object.inherit({ constructor: function(x, y) { this.x = x; this.y = y; }, draw: function() { alert('Point at [' + this.x + ', ' + this.y + ']'); } }, IMovable, IDrawable); // Этот код не будет выполнен пока // 1. не будет реализован метод "move" или // 2. не будет исключен интерфейс Перемещаемые из цепочки наследования var obj = new Point(1, 1); obj.draw(); |
а что, действительно похоже, объемно только...;)
|
Какая старая статья... И всё же хочется кое-что сказать.
Во-первых JavaScript не класс-ориентированный язык программирования а прототипный (что это значит можно почитать на вики) и соответственно практики из класс-ориентированного ООП в принципе не совсем для него подходят, хотя если вам нужен некий аналог интерфейса, то могу предложить следующее решение: // интерфейс var interfaceA = { methodA: methodForMatchAPlusB, methodB: methodForMatchAMinusB, methodC: methodC }; // основной код console.info('a + b = %d', interfaceA.methodA(1, 2)); console.info('a - b = %d', interfaceA.methodB(7, 5)); interfaceA.methodC(7, 4); //объявление функций function methodForMatchAPlusB(a, b) { return a+b; } function methodForMatchAMinusB(a, b) { return a - b; } function methodC(a, b) { var result = interfaceA.methodA(a, b) * interfaceA.methodB(a, b); console.info('(a+b)*(a-b) = %d', result); } Или можно тоже самое оформить ещё лучше: var objectA = new function() { // интерфейс this.methodA = methodForMatchAPlusB; this.methodB = methodForMatchAMinusB; this.methodC = methodC; //объявление функций function methodForMatchAPlusB(a, b) { return a+b; } function methodForMatchAMinusB(a, b) { return a - b; } function methodC(a, b) { var result = objectA.methodA(a, b) * objectA.methodB(a, b); console.info('(a+b)*(a-b) = %d', result); } }; // основной код (возможно уже в другом файле) console.info('a + b = %d', objectA.methodA(1, 2)); console.info('a - b = %d', objectA.methodB(7, 5)); objectA.methodC(7, 4); |
Цитата:
|
Цитата:
fu1=function(){} fu2=function(){} ob={a: fu1, b: fu2} |
Gaito, подобный подход, с предварительными объявлениями, оправдывает себя лишь в одном случае, при построении цепочек наследования с использованием оператора with.
Operations={ data: "", sum: "", mul: "", combine: function(){with(this) return sum()+mul()} } with(OperationsWithArray=Object.create(Operations)){ sum=function(){return this.data.reduce(function(x, y) {return x + y})} mul=function(){return this.data.reduce(function(x, y) {return x * y})} } with(OperationsWithNumber=Object.create(Operations)){ sum=function(){return this.data+this.data} mul=function(){return this.data*this.data} } with(Object.create(OperationsWithArray)){ data=[1,2,3] console.log(combine()) } with(Object.create(OperationsWithNumber)){ data=3 console.log(combine()) } |
Цитата:
|
EmperioAf,
Во первых, речь шла не о with как таковом, а об использовании предварительных деклараций, я тебе показал, где оно имеет смысл. Кроме этого случая, это нигде смысла не имеет, в том числе и в бредокоде, который тут выложен выше. По поводу with. Меня не интересует, что какой-нибудь очередной вася пупкин думает по поводу его использования. Он есть в стандарте, в том числе в ES6 |
Цитата:
|
Цитата:
|
специально для вас
Цитата:
jsInterface - реализация идеи классических ООП интерфейсов с поправкой на динамическую природу JavaScript. https://github.com/titulus/js-interface |
Часовой пояс GMT +3, время: 20:46. |