Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #51 (permalink)  
Старый 28.01.2011, 16:04
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от sysif
Потому что бесполезно или потому что вредно? Агрументируйте, плиз
Извините, я не смогу вам аргументировать, вы не поймёте. Вы пришли из статического языка и пытаетесь писать на JavaScript так, как вы писали на другом языке. Ничего хорошего из этого получится не может.

Читайте чужой код на JavaScript. Посмотрите как реализованы известные фреймворки, ExtJS, например. JQuery не смотрите, там чёрт ногу сломит.
Ответить с цитированием
  #52 (permalink)  
Старый 29.01.2011, 04:30
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от sysif
Может быть, вы тогда с такой же уверенностью скажете, зачем в языке с динамической типизацией конструкции instanceOf и typeof ?
да, надо признать, так уверенно я уже сказать не смогу не подумал об этом моменте. Но тогда я не вижу другого применения интерфейсам, кроме как в глобально-архитектурных задачах, необходимость решения которых не доказана

Сообщение от sysif
Аргументы в пользу я так понимаю были отброшены как не значимые?
второй аргумент (вроде больше нету), насколько я понял - головные боли. И опять же я не вижу другой причины, кроме как ломка от перехода на динамический язык программирования. Вы предлагаете сделать язык менее гибким ради решения несуществующей проблемы

но если вы знаете задачи, в которых нужны интерфейсы (в контексте js)... я всегда открыт для новых знаний
Ответить с цитированием
  #53 (permalink)  
Старый 29.01.2011, 05:04
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

а про typeof мне приходит в голову только выполнение разных действий в зависимости от типа аргументов
function $( id ){
    return   typeof id == 'string'   ? document.getElementById(id)   : id;
}


в конце концов присутствие чего-либо в языке ничего не означает. Вспомнить хотя бы The Good Parts Дугласа Крокфорда
Ответить с цитированием
  #54 (permalink)  
Старый 30.01.2011, 16:52
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

Цитата:
Может быть, вы тогда с такой же уверенностью скажете, зачем в языке с динамической типизацией конструкции instanceOf и typeof ?
Так как js - язык слабо типизированный, то необходим инструмент для определения типа конкретного объекта. Для этих целей и существуют операторы typeof и instanceof.

Первый оператор позволяет отличить примитивные типы от объектов. Второй - чтобы отличить один тип объекта от другого.

Этого достаточно, чтобы работать с языком, использовать всю его мощь и не думать об интерфейсах. Есть некоторые "казусы", о которых надо просто помнить. Например:
Код:
typeof null == 'object'
typeof [] == 'object'
Ответить с цитированием
  #55 (permalink)  
Старый 30.01.2011, 17:27
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

kidar2,
sysif,
Решает ли этот код проблему отсутствия интерфейсов?

Источник - Посоветуйте маленькую ооп библиотеку
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();

Последний раз редактировалось with-love-from-siberia, 30.01.2011 в 17:30.
Ответить с цитированием
  #56 (permalink)  
Старый 30.01.2011, 23:10
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

а что, действительно похоже, объемно только...

Последний раз редактировалось monolithed, 30.01.2011 в 23:17.
Ответить с цитированием
  #57 (permalink)  
Старый 23.07.2015, 10:22
Новичок на форуме
Отправить личное сообщение для Gaito Посмотреть профиль Найти все сообщения от Gaito
 
Регистрация: 23.07.2015
Сообщений: 1

Какая старая статья... И всё же хочется кое-что сказать.
Во-первых 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);
Ответить с цитированием
  #58 (permalink)  
Старый 23.07.2015, 11:29
Аспирант
Посмотреть профиль Найти все сообщения от tysonfury2015
 
Регистрация: 22.07.2015
Сообщений: 68

Сообщение от with-love-from-siberia
Решает ли этот код проблему отсутствия интерфейсов?
В чем заключается "проблема" отсутствия ынтырфейсов? Покажи задачу, которую с ынтырфейсами решить проще или эффективней, чем без них.

Последний раз редактировалось tysonfury2015, 23.07.2015 в 11:34.
Ответить с цитированием
  #59 (permalink)  
Старый 23.07.2015, 11:34
Аспирант
Посмотреть профиль Найти все сообщения от tysonfury2015
 
Регистрация: 22.07.2015
Сообщений: 68

Сообщение от Gaito
Или можно тоже самое оформить ещё лучше:
Твой код не имеет ни малейщего смысла, с точки зрения семантики. Ты просто размазал какие-то непонятные сопли. Это то же самое, примерно, что
fu1=function(){}
fu2=function(){}
ob={a: fu1, b: fu2}
Ответить с цитированием
  #60 (permalink)  
Старый 23.07.2015, 11:53
Аспирант
Посмотреть профиль Найти все сообщения от tysonfury2015
 
Регистрация: 22.07.2015
Сообщений: 68

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())
}

Последний раз редактировалось tysonfury2015, 23.07.2015 в 12:03.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Книга] Stoyan Stefanov, Javascript Patterns Dmitry A. Soshnikov Учебные материалы 20 13.08.2013 11:37
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
JavaScript разработчик (Яндекс, Москва) antonova Работа 2 08.07.2010 19:44
JavaScript на Яндекс.Фотки - почему тормозит браузеры? ZavFirefox Javascript под браузер 23 27.09.2009 19:24