Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Наследование (https://javascript.ru/forum/misc/10522-nasledovanie.html)

dp_ 08.07.2010 08:40

Наследование
 
<html>
<head>
<title>Inheritance demo</title>
</head>
<body>
<script type="text/javascript">


	var Class = function(parent,methods){
		if (arguments.length == 1) { 
			methods = parent; 
			parent = null; 
		}
		var child = function() { 
			this.initialize.apply(this, arguments);
		};
		if (typeof(parent) == 'function') {
			child.prototype = new parent;
			child.superclass = parent;
		}
		if (typeof(methods) != 'undefined' && methods !== null) {
			for (var prop in methods) {
				if (!child.prototype[prop] && typeof(methods[prop]) == 'function') {
					child.prototype[prop] = methods[prop];
				}
			}
		}
		if (!child.prototype.initialize) child.prototype.initialize = function(){};
		child.prototype.constructor = child;
		return child;
	}

	var baseClass = Class({
		initialize:function(text){
			this.text = text;
		},
		display: function(){
			alert(this.text);
		}
	});

	var childClass = Class(baseClass,{
		initialize:function(){
			this.superclass("base class text");
		},
		display2: function(){
			alert('child class text');
		}
	});

	var obj = childClass();
	obj.display();
	obj.display2();


</script>
</body>
</html>

Может кто нибудь мне объяснить почему этот код не работает?

Gozar 08.07.2010 10:25

догадываюсь, потому что в нём ошибка? ;)

exec 08.07.2010 10:51

Ага, и ещё она между 1-ой и 58-ой строкой кода.

dp_ 08.07.2010 12:05

Круто, но мне не такой ответ нужен
 
Зачем оставлять бессмысленные посты

Kolyaj 08.07.2010 12:58

Работает.

dp_ 08.07.2010 13:25

Цитата:

Сообщение от Kolyaj (Сообщение 62768)
Работает.

TypeError: Result of expression 'this.initialize' [undefined] is not an object.

Kolyaj 08.07.2010 13:41

Цитата:

Сообщение от dp_
TypeError: Result of expression 'this.initialize' [undefined] is not an object.

Что мешало сразу написать, что именно не работает?

Цитата:

Сообщение от dp_
this.superclass("base class text");

Так нельзя. Должно быть что-то вроде
this.superclass.prototype.initialize.call(this, "base class text");


Ну и смена сигнатуры метода в дочернем классе дурной тон.

dp_ 08.07.2010 15:18

Цитата:

Сообщение от Kolyaj (Сообщение 62778)
Что мешало сразу написать, что именно не работает?


Так нельзя. Должно быть что-то вроде
this.superclass.prototype.initialize.call(this, "base class text");


Ну и смена сигнатуры метода в дочернем классе дурной тон.

Проблема в том что до вызова метода superclass дело и не доходит ошибка возникает раньше проблема где то в функции Class что-то не так с механизмом наследования И где вы увидели смену сигнатуры? Конструктор базового класса вызывается с теми параметрами с какими и объявлен !

Kolyaj 08.07.2010 15:21

Цитата:

Сообщение от dp_
Проблема в том что до вызова метода superclass дело и не доходит

Ну да, не обратил внимания. http://javascript.ru/tutorial/object...unkciya-extend


Цитата:

Сообщение от dp_
И где вы увидели смену сигнатуры?

childClass.initialize не передаёт свои аргументы в baseClass.initialize

dp_ 08.07.2010 15:23

Цитата:

Сообщение от Kolyaj (Сообщение 62778)
Что мешало сразу написать, что именно не работает?

Мешает то что если указать не ошибку которую вижу я то можно забыть о свежем взгляде на проблему со сторону тех кому этот вопрос адресован


Часовой пояс GMT +3, время: 23:25.