2014-09-16 1 views
0

Посмотрите мою проблему:javascript. Проблемы с ссылками. Наследование. Область применение Настоящего

У меня есть класс, который выглядит примерно так:

var els=[]; 
var base = function(){ 
    this.config = {} 
} 


var X1 = function(){ 
} 
X1.prototype = new base(); 
X1.prototype.indexme = function(i){ 
    this.config.index = i; 
} 
X1.prototype.add = function(){ 
    var i = els.push(this) 
    this.indexme(i) 
} 

var teste = new X1(); 
teste.add(); 
var teste2 = new X1(); 
teste2.add(); 
var teste3 = new X1(); 
teste3.add(); 

console.log(els) 

Почему this.config.index переписываются в другие случаи?

Я ожидал, что teste имеет config.index = 1; teste2 config.index = 2 и teste3 config.index = 3

Благодаря

+0

Что такое 'this.teste (i)'? Кроме того, вы наследуете весь объект 'config'. Это всегда один и тот же объект. – Amadan

+0

Вы нажимаете объект X1 на els, поэтому индекс не будет числом. – PHPglue

+0

Я думаю, что 'X1.prototype.test' должно быть' X1.prototype.teste' = плохое редактирование – PHPglue

ответ

2

Все экземпляры X1 один и тот же прототип, который является экземпляром base с config собственности. Таким образом, все экземпляры X1 делят одно и то же имущество config. Вы можете переместить строку this.config = {}; в конструктор X1 или вы можете определить функцию init() в base, которая назначает this.config для каждого объекта и вызывает init() от конструктора X1.

+0

Идея - это только базовая модель для моих других классов, если я делаю копию this.config в начале других классов, это плохое решение? –

+0

Еще одно сомнение. Если я делаю: this.config = {index: var}, все мои экземпляры получают правильные значения. Почему this.config.index получает одинаковые значения? В теории this.config уже имеют ссылки в прототипе? Или простой факт, что я делаю атрибуцию, очищаю ссылки? –

+1

Когда вы назначаете свойство 'config' для' this', оно скрывает одно и то же свойство в прототипе, но свойство prototype все еще существует. –

Смежные вопросы