| 
	| 
	
	| 
		
	| 
			
			 
			
				31.01.2009, 16:14
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 31.01.2009 
						Сообщений: 3
					 
		
 |  |  
	| 
				ООП: как создавать наследника от встроенных объектов?
			 Добрый день.Объясните новичку, как должен выглятедь конструктор, который будет создавать объекты наследующие свойства встроенных объектов? Чтобы уже в этом конструкторе была возможность переопределять и добавлять новые свойства.
 Например чтобы массив создавался не через new Array, а через new myArray.
 
 Спасибо.
 |  |  
	| 
		
	| 
			
			 
			
				31.01.2009, 16:18
			
			
			
		 |  
	| 
		
			|  | Интересующийся       |  | 
					Регистрация: 30.01.2009 
						Сообщений: 28
					 
		
 |  |  
	| 
	
 
	| Сообщение от Langalier   |  
	| Добрый день. Объясните новичку, как должен выглятедь конструктор, который будет создавать объекты наследующие свойства встроенных объектов? Чтобы уже в этом конструкторе была возможность переопределять и добавлять новые свойства.
 Например чтобы массив создавался не через new Array, а через new myArray.
 
 Спасибо.
 |  
	
 вопрос: если вы новичок - какого вы спрашивается полезли сразу в ооп ?   http://wdh.suncloud.ru/js07.htm
object 
конструктор будет выглядеть 
 
	
 
	| Код: |  
	| function Circle(radius) {
  this.radius = radius;
}
Circle.prototype.area = function() {
  return Math.PI * this.radius * this.radius;
}
function FullCircle(x, y, radius) {
  this.x = x;
  this.y = y;
  this.radius = radius;
}
FullCircle.prototype = Circle.prototype;
var myCircle = new FullCircle(0, 0, 1);
document.write(myCircle.area()); |  
	
 
В языках, основанных на классах, классы объектов образуют иерархию классов, в которой каждый класс может быть потомком какого-либо ранее определенного класса. Потомок класса наследует все его свойства, но может иметь дополнительные собственные свойства или изменять свойства своего предка. При этом набор свойств данного класса зафиксирован в его декларации и не может быть изменен в ходе выполнения программы. Можно сказать, что здесь текущее состояние реализуется экземплярами классов, методы реализуются классами, а наследование — структурой и поведением.
 
JavaScript поддерживает наследование, основанное на прототипах. С каждым конструктором связан соответствующий прототип объекта, и каждый объект, созданный конструктором, содержит неявную ссылку на этот прототип. Прототип, в свою очередь, может содержать ссылку на свой прототип и так далее. Так образуется цепочка прототипов. Ссылка на свойство объекта — это ссылка на первый прототип в цепочке прототипов объекта, который содержит свойство с данным именем. Иными словами, если данный объект имеет свойство с данным именем, то используется ссылка на это свойство; если нет, то исследуется прототип этого объекта и т. д.
 
В JavaScript текущее состояние и методы реализуются объектами, а структура и поведение наследуются. Все объекты, которое явно содержат свойство, которое содержит их прототип, разделяют это свойство и его значение. В отличие от языков, основанных на классах, свойства могут динамически добавляться к объектам и динамически удаляться. В частности, конструкторы не обязаны присваивать значения всем или некоторым свойствам создаваемого объекта. 
p.s. 
вас googl'ом пользоваться не учили ? 			 Последний раз редактировалось q--b, 31.01.2009 в 16:25.
 |  |  
	| 
		
	| 
			
			 
			
				31.01.2009, 17:25
			
			
			
		 |  
	| 
		
			
			|        |  | 
					Регистрация: 21.02.2008 
						Сообщений: 1,250
					 
		
 |  |  
	| Боюсь, что прозрачный интерфейс (или прокси) для встроенных классов у вас сделать не получится. |  |  
	| 
		
	| 
			
			 
			
				31.01.2009, 20:00
			
			
			
		 |  
	| 
		
			|  | 
       |  | 
					Регистрация: 27.12.2008 
						Сообщений: 4,201
					 
		
 |  |  
	| q--b, недавно разобрался с javascript-oop и уже поучаешь?
 
	
 
	| Цитата: |  
	| Объясните новичку, как должен выглятедь конструктор, который будет создавать объекты наследующие свойства встроенных объектов? |  
	
 точно так же как и для невстроенных (http://javascript.ru/tutorial/object/inheritance ). Кроме того, можно добавлять свойства в созданные массивы, а не в прототип. Для чего вообще все это нужно?
 
	
 
	| Цитата: |  
	| Боюсь, что прозрачный интерфейс (или прокси) для встроенных классов у вас сделать не получится. |  
	
 ? |  |  
	| 
		
	| 
			
			 
			
				31.01.2009, 21:06
			
			
			
		 |  
	| 
		
			
			|        |  | 
					Регистрация: 21.02.2008 
						Сообщений: 1,250
					 
		
 |  |  
	| x-yuri,Может я просто не додумался, но попробуй сделать свой объект, который будет расширять, например, Array, при этом сохраняя его функциональность, как массива.
 |  |  
	| 
		
	| 
			
			 
			
				31.01.2009, 22:39
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 31.01.2009 
						Сообщений: 3
					 
		
 |  |  
	| Большое спасибо за ответы. 
2x-yuri , уже 2 дня медитирую как раз над указанной вами статьей о наследовании. С пониманием принципов наследования через прототипы все в порядке. Но попытки создать класс, который бы унаследовал все свойства объекта Array, чтобы не переопределять методы самого Array, а дабавлять их к созданному классу не получилось. По видимому не могу уловить какие то базовые принципы.
 
2Андрей Параничев 
Только что в ветке "10 лучших функций на JavaScript" обнаружил в комментариях такой код:
 
ArrayUtils.inArray = (Array.prototype.indexOf) ?
    function (/* Array */a, /* Mixed */val) {
        return a.indexOf(val) != -1;
    } :
    function (/* Array */a, /* Mixed */val) {
        var i = a.length;
        while (i--) {
            if (a[i] === val) return true;
        }
        return false;
    }
разве это не реализация того самого "прозрачного" интерфейса?
 
2q--b  Спасибо за подробный ответ. Давайте только причины и способы изучения ООП оставим на моей совести.			 Последний раз редактировалось Langalier, 31.01.2009 в 22:45.
 |  |  
	| 
		
	| 
			
			 
			
				31.01.2009, 22:58
			
			
			
		 |  
	| 
		
			
			|        |  | 
					Регистрация: 21.02.2008 
						Сообщений: 1,250
					 
		
 |  |  
	| Langalier, 
Не совсем то, что я имел в виду, вот например попробуем создать конструктор myArray, который бы выдавал нам массив, но имел расширенные (перегруженные) методы работы с элементами. Далеко ходить не будем, возьмем функцию из статьи:
 
function extend(Child, Parent) {
    var F = function() { }
    F.prototype = Parent.prototype
    Child.prototype = new F()
    Child.prototype.constructor = Child
    Child.superclass = Parent.prototype    
}
Теперь напишем конструктор объектов myArray:
 
var myArray = function() {
    this.getLastElement = function() {
        return this[this.length-1];
    }
}
// И наследуем массив:
extend(myArray, Array);
Посмотрим, что получилось:
 
// Создадим наш объект:
var a = new myArray();
// Добавим ему элементов, через свойства:
a[0] = "Привет";
a[1] = "Мир";
// Пробуем
alert(a.getLastElement()); // undefined - ничего
// А длина?
alert(a.length); // 0 - пусто
// Теперь добавим через методы:
a.push("Пока");
a.push("Ад");
// Пробуем
alert(a.getLastElement()); // "Ад"
// А длина?
alert(a.length); // 2, все в порядке
Другими словами, вам не удастся наследовать всю функциональность массивов, когда добавление элемента напрямую увеличивало длину массива. 
			
			
	
			
			
			
			
			
				  |  |  
	| 
		
	| 
			
			 
			
				31.01.2009, 23:56
			
			
			
		 |  
	| 
		
			
			| ...       |  | 
					Регистрация: 09.03.2008 
						Сообщений: 216
					 
		
 |  |  
	| 
	
 
	| Сообщение от Андрей Параничев   |  
	| когда добавление элемента напрямую увеличивало длину массива |  
	
 IE не сможет и не напрямую. |  |  
	| 
		
	| 
			
			 
			
				01.02.2009, 05:17
			
			
			
		 |  
	| 
		
			|  | 
       |  | 
					Регистрация: 27.12.2008 
						Сообщений: 4,201
					 
		
 |  |  
	| 
	
 
	| Цитата: |  
	| IE не сможет и не напрямую. |  
	
 ну с ff, допустим, понятно, он длину не обновляет. Может, правда, еще какие нюансы есть 
но что IE хочет? O_o если унаследоваться от Array то нельзя изменить свойство length объекта
Langalier , повторюсь, для чего собственно нужно наследоваться от массива? 
а вообще вижу такие варианты: 
1) создать внешний объект (типа ArrayUtils), который будет выполнять дополнительные операции над массивами 
2) добавлять функциональность в созданные массивы (arr.getLastElement = getLastElement) 
3) сделать класс-обертку типа jQuery ($(arr).getLastElement()) 
4) добавлять методы в Array.prototype, но это крайняя мера. Из-за этого, наверняка, перестанет корректно работать код обходящий массивы с помощью for...in |  |  
	| 
		
	| 
			
			 
			
				01.02.2009, 12:23
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 31.01.2009 
						Сообщений: 3
					 
		
 |  |  
	| Андрей ПараничевСпасибо. Очень помогло пониманию.
 
 x-yuri
 Если я правильно понимаю, то скорее 3 вариант.
 |  |  |  |