xoma2
@xoma2
Программист

Как разобраться с прототипом и конструктором?

Помогите разобрать данный код. Мне кажется я чего то не понимаю.

Свойство прототип это промежуточный объект. Объясните построчно пожалуйтса

function extend(Child, Parent) {
	var F = function() { }
	F.prototype = Parent.prototype
	Child.prototype = new F()
	Child.prototype.constructor = Child
	Child.superclass = Parent.prototype
}
  • Вопрос задан
  • 2449 просмотров
Пригласить эксперта
Ответы на вопрос 1
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
var F = function() { }
F.prototype = Parent.prototype
Child.prototype = new F()

Создаём промежуточный вспомогательный конструктор, который нужен, чтобы не тащить все штуки-дрюки из создания объекта с помощью непосредственно конструктора Parent. Мы же не знаем, какие собственные свойства навешиваются при вызове конструктора?

Child.prototype = new Parent()
При таком вызове можно подхватить чёрт-те знает что.

Child.prototype.constructor = Child
Обновили ссылку на конструктор в прототипе. Для чего? Видимо для того, чтобы строки имели одинаковый эффект:
var iLoveToMakeChild1 = Object.create(Child.prototype)
var iLoveToMakeChild2 = new Child()


Child.superclass = Parent.prototype
И на всякий случай положили в свойство конструктора ссылочку на прототип своего предка. Бывает очень нужно.

Ваш пример — типичная схема наследования.
Что почитать:
dmitrysoshnikov.com/ecmascript/ru-javascript-the-core
habrahabr.ru/post/120193
habrahabr.ru/post/108915

Update:
Не уверен, что это пояснение действительно пояснит, но...

05c7add10c82486b89a0109e62db1c7f.png
function Млекопитающее() {
	//И вот тут может произойти непонятное без прокладки F
}
Млекопитающее.prototype.commonParams = [
	'Вскармливает детей молоком',
	'Теплокровное'
];

function Человек(options) {
	if (options && typeof options == 'object') {
		for (var i in options) {
			this[i] = options[i];
		}
	}
}

function Кошка(options) {
	if (options && typeof options == 'object') {
		for (var i in options) {
			this[i] = options[i];
		}
	}
}

function extend(Child, Parent) {
	var F = function() { };
	F.prototype = Parent.prototype;
	Child.prototype = new F();
	Child.prototype.constructor = Child;
	Child.superclass = Parent.prototype;
}

extend(Человек, Млекопитающее);
Человек.prototype.ownParams = [
	'Носит одежду',
	'Поёт в караоке'
];

extend(Кошка, Млекопитающее);
Кошка.prototype.ownParams = [
	'Забавно урчит',
	'Ест мух'
];

var man1 = new Человек({
		name: 'Петя',
		params: [
			'Брюнет',
			'Любит Хауса',
			'Бросил курить'
		]
	}),
	animal1 = new Кошка({
		name: 'Маська',
		params: [
			'Любит кукурузу',
			'Имеет 2 лотка'
		]
	});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы