Javascript 引用混淆



类被实例化并存储在变量中。变量的引用用于将"prop"更改为"change"。引用被传递并存储在另一个变量中并注销。啊

function ctrl () {
  function Klasse () {
      this.prop = 'prop';
  }
  var _klasse = new Klasse();
  return {
      get: function () {
          console.log('get', _klasse);
          return _klasse
      },
      change: function () {
          _klasse.prop = 'changed';
          console.log('change', _klasse);
      },
      reset : function () {
          _klasse = new Klasse();            
      }
  }
}
ctrl().change();
var _klasseReferenz = ctrl().get();
// Why is _klasseReferenz.prop !== 'changed' ????
console.log('referenz ', _klasseReferenz);

小提琴:http://jsfiddle.net/Lfg85x96/1/

因为每次调用ctrl时,它都会创建新的Klasse实例。您应该将其更改为:

var ctrlInstance = new ctrl();
ctrlInstance.change();
var _klasseReferenz = ctrlInstance.get();
console.log('referenz ', _klasseReferenz);

见小提琴

每次调用ctrl()时,您都会创建一个_klass该闭包本地的新实例。您需要保存引用调用,并调用 get 并在此基础上进行更新。

var reference = ctrl();
reference.change();
var _klasseReferenz = reference.get();

ctrl().change(); -->你只是单独调用函数(不保存引用调用)

var _klasseReferenz = ctrl().get(); --> 这就像你正在创建一个对象一样。

为什么 _klasseReferenz.prop !== "更改"????console.log('referenz ', _klasseReferenz);

在第一行中,您只调用函数,没有引用,从第二行开始接下来,您已经创建了一个对象并开始引用它。

使用以下代码行来理解

var ctl = new ctrl();
ctl.change();
console.log('NowRefrenceWorking ', ctl.get());

您正在创建对 ctrl 函数的引用。而不是ctrl().change()和ctrl().get()只需为变量分配一个新的ctrl实例

var _ctrl = new ctrl();
ctrl.change();
ctrl.get();

最新更新