0

Я изучаю шаблон, в котором вы можете сохранить глобальную ссылку на текущий экземпляр для простого использования в анонимных функциях, где ключевое слово this вне контекста. Рассмотрим это:Глобальный экземпляр в прототипе javascript

var instance; 

var a = function(id) { 
    instance = this; 
    this.id = id; 
}; 

a.prototype.get = function() { 
    return (function() { 
    return instance.id; 
    })(); 
}; 


var x = new a('x'); 
var y = new a('y'); 

console.log(x.get()); 
console.log(y.get()); 

Это, очевидно, не будет работать, так как экземпляр определяется в конструкторе, чтобы каждый раз, когда .get() называется, instance будет ссылаться на последний построенный объект. Таким образом, он дает «y» оба раза.

Однако я ищу способ захватить экземпляр внутри метода прототипа без использования ключевого слова this, чтобы сделать код более читаемым. Синглтоны здесь не вариант, мне нужно прототипное наследование.

ответ

1

Edit: Поскольку вы избегаете хранить «локальные экземпляры», Есть несколько подходов, например:

Использование call или apply изменить значение this в вызываемой функции:

var a = function (id) { 
    this.id = id; 
}; 

a.prototype.get = function() { 

    return (function() { 
    return this.id; // the inner `this` value will refer to the value of outside 
    }).call(this); 
}; 

Использование аргумента:

//.. 
a.prototype.get = function() { 

    return (function(instance) { 
    return instance.id; 
    })(this); 
}; 

новый ECMAScript 5-е издание представило bind метод, который является чрезвычайно полезным сохраняться значением this и дополнительные связанные аргументы, вы можете найти совместимую реализацию here:

//.. 
a.prototype.get = function() { 
    var boundFunction = (function() { 
    return this.id; 
    }).bind(this); 

    return boundFunction(); // no matter how the function is invoked its `this` 
};      // value will always refer to the instance. 
+0

да, точно. Я ищу способ избежать сохранения локальных экземпляров для каждого метода прототипа при использовании анонимных функций. – David

+0

Я предполагаю, что это «нет», но спасибо за предоставление шаблонов для приведения контекста в анонимные функции. – David

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