@websiller

Зачем нужен Object.create?

Зачем нужен Object.create и прочие кастомные inherit(), если можно сделать просто вот так:?
var o = {
			f:function(){
				console.log('f');
			}
		};

		var o2 = {
			f2:function(){
				console.log('f2');
			}
		};
		$.extend(o2, o);
		
		function R(){

		}
		R.prototype = o2;

		var r = new R();

		r.f2(); // 'f2'
		r.f(); // 'f'
  • Вопрос задан
  • 582 просмотра
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
JS мультипарадигмальный язык. Object.create это, более характерная прототипному программированию, альтернатива оператора new:
const human = {
  planet: 'Earth',
}

const tom = Object.create(human);
tom.name = 'Tom';
tom.age = 32;
tom.country = 'UK';

console.log(tom.planet);

// => Earth


Ключ planet при этом не создается в новом объекте, а берется при вызове tom.planet из прототипа human, пока не будет переназначен в tom.
5a291ca5a1b64550694668.png
И если мы изменим прототип human после создания tom, то:
const human = {
  planet: 'Earth',
}

const tom = Object.create(human);
tom.name = 'Tom';
tom.age = 32;
tom.country = 'UK';

human.planet = 'Mars';

console.log(tom.planet);

// => Mars


но если мы переназначим tom.palnet, то:
const human = {
  planet: 'Earth',
}

const tom = Object.create(human);
tom.name = 'Tom';
tom.age = 32;
tom.country = 'UK';

tom.planet = 'Jupiter';
human.planet = 'Mars';

console.log(tom.planet);

// => Jupiter

console.log(human.planet);

// => Mars


$.extend в свою очередь при вызове:
const human = {
  planet: 'Earth',
}

const tom = $.extend({}, human);
tom.name = 'Tom';
tom.age = 32;
tom.country = 'UK';

создаст новый объект tom включающий в себя ключи human без прототипирования.
5a291cb3705c0343579580.png
Надеюсь разница понятна.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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