Показать сообщение отдельно
  #26 (permalink)  
Старый 07.07.2011, 11:15
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

Сообщение от monolithed Посмотреть сообщение
По мне, просто игра слов не более. Или мне одному так кажется?

PS: Parasitic inheritance
А всё таки это интересно

Вот небольшой пример - очень некрасивой реализации ООП.
function Transport(config){
	var config = config || {};
	this.type = "Транспорт";
	this.wheel = 0;
	this.maxVelocity = 0;
	this.velocity=0;
	this.deltaVelocity=0;
	for(var p in config){
		this[p]=config[p];
	}
}

Transport.prototype = {
	engine: 'никакой',
	isDrive:false,
	faster:function(){
		if(this.isDrive){
			if(this.velocity<this.maxVelocity){
				this.velocity+=this.deltaVelocity;
			}
			else{
				console.log(this.type+" быстрее ехать не может");
			}
		}
		else{
			console.log("Необходимо завести машину");
		}
	},
	slower:function(){
		if(this.velocity>0){
			this.velocity-=this.deltaVelocity;
		}
		else{
			console.log("Медленее ехать нельзя");
		}
	},
	drive:function(insideInvoke){
		var me = this; 
		if(!insideInvoke && me.isDrive){
			return;
		} 
		if(!insideInvoke){
			console.log(me.type+" заведена");
			me.isDrive = true;
		}
		if(me.isDrive){
			console.log('Едит '+me.type+' на '+me.wheel+' колесах. Скорость '+me.velocity+'...');
			setTimeout(function(){
				me.drive(true);
			},1000);
		}
	},
	stop:function(){
		this.isDrive = false;
	}
};

//var t = new Transport();
//t.drive();

function Car(config){
	var config = config || {};
	this.type = "Машина";
	this.wheel = 4;
	this.maxVelocity = 60;
	for(var p in config){
		this[p]=config[p];
	}
	Car.superclass.constructor.call(this);
}

Car.prototype = new Transport();
Car.superclass = Transport.prototype;
Car.prototype.deltaVelocity=10;

//var c = new Car();

function SuperCar(config){
	var config = config || {};
	this.type = "СуперМашина";
	this.wheel = 4;
	this.maxVelocity = 100;
	for(var p in config){
		this[p]=config[p];
	}
	Car.superclass.constructor.call(this);
}

SuperCar.prototype = new Car();
SuperCar.superclass = Car.prototype;
SuperCar.prototype.deltaVelocity=20;

var sc = new SuperCar();


Если не лень. Скопируйте и запустите.
Поуправляйте Супер Машиной в консоле
через
sc.drive();
sc.faster();
sc.slower();


А потом, просто для себя попробуйте реализовать
функцию extend - без подсказок из интернета(на собеседовании же не будет возможности пользоваться инетом).
для вот такого наследования
Заметка - вообще полностью весь код надо придумать самому.
Поэтому это итак очень большая подсказка.

У Вас есть три объекта A,B,C
B наследует A, ну а C наследует B.

C = extend(B,{
	constructor: function(config){
		applyIf(config,{
			h:6
		});
		B.superclass.constructor.call(this, config);
	},
	b:4,
	c:5
});

function applyIf(o, c){
	if(o){
		for(var p in c){
			if(!isDefined(o[p])){
				o[p] = c[p];
            }
        }
    }
    return o;
}

function isDefined(v){
	return typeof v !== 'undefined';
}


В итоге при вызове
console.log(new C({b:8,h:5}));

Должен получиться объект
{
   b:8,
   h:5,
   c:5
}


Не надо меня спрашивать подробности, это я так набросал.
Пример и реализацию на собеседовании Вам нужно сделать самому.

Сразу скажу, что я не сделал это.

Последний раз редактировалось mycoding, 07.07.2011 в 11:20.
Ответить с цитированием