Прототип объекта - это просто объект.Свойства прототипа являются общими для всех объектов, которые наследуют от этого объекта.Копии свойств не создаются, если вы создаете новый экземпляр «класса» (классы в JS все равно не существуют), то есть объект, который наследуется от прототипа.
Это только влияет накак вы используете эти унаследованные свойства:
function Foo() {}
Foo.prototype = {
array: [],
func: function() {}
}
a = new Foo();
b = new Foo();
a.array.push('bar');
console.log(b.array); // prints ["bar"]
b.func.bar = 'baz';
console.log(a.func.bar); // prints baz
Во всех этих случаях вы всегда работаете с одним и тем же объектом.
Но если вы присваиваете значение дляСвойство объекта, свойство будет установлено / создано для самого объекта, а не для его прототипа, и, следовательно, не будет совместно использоваться:
console.log(a.hasOwnProperty('array')); // prints false
console.log(a.array); // prints ["bar"]
a.array = ['foo'];
console.log(a.hasOwnProperty('array')); // prints true
console.log(a.array); // prints ["foo"]
console.log(b.array); // prints ["bar"]
Если вы хотите создать собственные массивы для каждого экземпляра,Вы должны определить его в конструкторе:
function Foo() {
this.array = [];
}
, потому что здесь this
относится к объекту new
, который генерируется при вызове new Foo()
.
Правилоthumb: Экземпляр -специфичные данные должны быть назначены экземпляру внутри конструктора , shared данных (как методы) должны быть назначенык прототипу .
YouВозможно, вам захочется прочитать Подробную информацию об объектной модели , которая описывает различия между языками на основе классов и прототипами и как на самом деле работают объекты.
Обновление:
Вы можете получить доступ к прототипу объекта через Object.getPrototypeOf(obj)
(может не работать в очень старых браузерах), а Object.getPrototypeOf(a) === Object.getPrototypeOf(b)
дает вам true
.Это тот же объект, также известный как Foo.prototype
.