Показать сообщение отдельно
  #1 (permalink)  
Старый 19.01.2010, 18:09
Аватар для Shaci
:-/
Отправить личное сообщение для Shaci Посмотреть профиль Найти все сообщения от Shaci
 
Регистрация: 28.09.2009
Сообщений: 1,126

Вопрос про ООП, цепочки прототипов.
Попробовал разобраться в наследовании объектов по прототипам, тема сложная местами, поэтому возникают вопросы...(вопросы в комментах кода, ближе к концу). Код сочинял сам, возможно где-то сильно заблуждаюсь в комментах.

//первый "класс"
   //по умолчанию, прототипом объектов данного "класса" является
   //объект встроенного класса Object
   //Свойство MyArray1.prototype = new Object()
   var MyArray1 = function() {};
   //Создаем объект класса MyArray1
   var first = new MyArray1();//
   //MyArray1.prototype = объекту-прототипу (класса Object), который
   //по умолчанию имеет единственое свойство constructor,
   //В общем случае свойство constructor объекта указывает на его конструктор,
   //но в данном случае, constructor прототипа указывает на саму функцию конструктор,
   //с которой этот прототип ассоциируется, т.е. на MyArray1
   alert("First object");
   alert("constructor");
   alert("(MyArray1.prototype.constructor == MyArray1) = " + (MyArray1.prototype.constructor == MyArray1));//true

   alert("(MyArray1.prototype.constructor == Object)=" + (MyArray1.prototype.constructor == Object));//false
   //а это в общем случае:свойство конструктор будет указывать на конструктор данного объекта
   alert("(first.constructor == MyArray1) = " + (first.constructor == MyArray1));//true
   alert("(first.constructor == Object) = " + (first.constructor == Object));//false
   
   //создадим второй "класс"
   var MyArray2 = function() {};

   //оператор instanceof
   alert("instanceof");
   alert("(first instanceof MyArray1) = " + (first instanceof MyArray1));//true
   alert("(first instanceof MyArray2) = " + (first instanceof MyArray2));//false
   alert( "(first instanceof Object) = " + (first instanceof Object));//true

   //Далее назначим явно прототип   
   MyArray1.prototype = new MyArray2();
   //второй объект класса MyArray1(), теперь уже у класса другой прототип
   var second = new MyArray1();

   alert("Second object");
   //оператор instanceof
   alert("instanceof");
   alert("(second instanceof MyArray1) = " + (second instanceof MyArray1));//true
   alert("(second instanceof MyArray2) = " + (second instanceof MyArray2));//true
   alert( "(second instanceof Object) = " + (second instanceof Object));//true

   alert("constructor");
   //Так как теперь прототип указан "явно", то, по умолчанию, его свойство constructor равно его
   //коструктору
   alert("(MyArray1.prototype.constructor == MyArray2) = " + (MyArray1.prototype.constructor == MyArray2));//true
   //и, соответственно
   alert("(MyArray1.prototype.constructor == MyArray1) = " + (MyArray1.prototype.constructor == MyArray1));//false
   //теперь наследование свойства constructor, происходит , видимо, несколько не так, как
   //наследование обычного свойства:
   alert("(second.constructor == MyArray1) = " + (second.constructor == MyArray1));//false
   alert("(second.constructor == MyArray2) = " + (second.constructor == MyArray2));//true - наследуется свойство constructor прототипа
   //хотя по идее, если не ошибаюсь, должно происходить перекрытие свойств родителя

   //----------------------------------------------------------------------
   //До этого момента логика была более менее связная...
   
   //Вот теперь вопрос
   //Если мы "продолжим" наследование
   MyArray2.prototype = new Array();

   //т.е. по идее: объекты "класса" MyArray1 имеют прототипом объект класса MyArray2
   //а объекты класса MyArray2 - прототипом объект класса Array()
   //=> вроде как цепочка
   var third = new MyArray1();

   alert("Third object");
   //Совбственно дальше один большой вопрос, почему alert выдает такие значения?
   alert("instanceof");
   alert("(third instanceof MyArray1) = " + (third instanceof MyArray1));//true
   alert("(third instanceof MyArray2) = " + (third instanceof MyArray2));//false ?????????????????
   alert("(third instanceof Array) = " + (third instanceof Array));//false ?????????????????
   alert("(third instanceof Object) = " + (third instanceof Object));//true

   alert("constructor");
   alert("(MyArray1.prototype.constructor == MyArray2) = " + (MyArray1.prototype.constructor == MyArray2));// ??? true, а здесь не
   //должно происходить какое-нибудь очередное наследование конструктора прототипа?,
   //он же объект класса MyArray2 и имеет прототип - объект класса Array => его конструктор
   //по идее должен наследоваться?
   //т.е. MyArray1.prototype.constructor по идее должен быть равен Array???? или нет..
   alert("(MyArray1.prototype.constructor == Array) = " + (MyArray1.prototype.constructor == Array));//false ???
   alert("(MyArray1.prototype.constructor == MyArray1) = " + (MyArray1.prototype.constructor == MyArray1));//false
   
   alert("(third.constructor == MyArray1) = " + (third.constructor == MyArray1));//false
   alert("(third.constructor == MyArray2) = " + (third.constructor == MyArray2));//true
   alert("(third.constructor == Array) = " + (third.constructor == Array));//false , здесь не происходит дальнейшего наследования????
Ответить с цитированием