Глобальный экземпляр в прототипе JavaScript - PullRequest
0 голосов
/ 17 августа 2010

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

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 Ответ

1 голос
/ 17 августа 2010

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

Использование 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); 
};

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

//..
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.
...