grabbee
@grabbee

Как скопировать свойство/объект из прототипа?

Прототип объекта содержит другой объект и при создании экземпляра, каждый ссылается на него. Хотелось бы чтобы каждый имел копию этого объекта а не ссылку на прототип.

Делаю библиотеку содержащую список простых фильтров. Он предустанавливается до создания экземпляра и дальше, после создания имеет возможность изменяться. Хотелось бы, чтобы при создании экземпляра в нем была своя копия объекта фильтров, а не ссылка на глобальный.

var SomeObject = function() {
  this.prop = 'any';
}

SomeObject.prototype = {
  filters: {
    // список фильтров и методы
    add() {
       // добавляет фильтр к списку фильтров
    }
  }
}

SomeObject.filters.add(name1, filter);
SomeObject.filters.add(name2, filter);

var Instance1 = new SomeObject();
var Instance2 = new SomeObject();

Instance1.filters.add(name3, filter);
// третий фильтр добавился глобально и будет во втором экземпляре тоже
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
potapchino
@potapchino
var SomeObject = function() {
  this.prop = 'any';
  this.filters = Object.assign({}, this.constructor.filters);
}

SomeObject.filters = SomeObject.prototype.filters = {};
SomeObject.addFilter = SomeObject.prototype.addFilter = function(n){
  this.filters[n] = function(){
    console.log(n);
  }
};

SomeObject.addFilter('a');
SomeObject.addFilter('b');

var Instance1 = new SomeObject();
var Instance2 = new SomeObject();

Instance1.addFilter('c');

console.log(Instance1.filters.a()); // 'a'
console.log(Instance2.filters.a()); // 'a'

console.log(Instance1.filters.b()); // 'b'
console.log(Instance2.filters.b()); // 'b'

console.log(Instance1.filters.c()); // 'c'
console.log(Instance2.filters.c()); // TypeError: Instance2.filters.c is not a function
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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