为什么Angular不在原型上声明对象的所有函数?

时间:2013-06-27 00:04:26

标签: javascript angularjs angular-ui

参考这个问题:Understanding better Javascript OOP architecture

Angular将名为self的闭包变量设置为this。之后它在handleLocationChange中用于查找正确的this。我查看了code,但找不到调用或注册handleLocationChange的任何示例。

在我对上述问题的回答中,我推测它是在构造函数体中声明的,因为事件/发布/订阅实现将在没有实例的情况下传递handleLocationChange所以当它被调用时它无法使用.call.apply,因为具体实例未知。

也许具有Angular经验的人可以解释如何使用handleLocationChange,注册的函数在哪里以及为什么它不在Dialog的原型上?

function Dialog(opts) {

            var self = this, options = this.options = angular.extend({}, defaults, globalOptions, opts);
            this._open = false;

            this.backdropEl = createElement(options.backdropClass);
            if(options.backdropFade){
                // ...
            }

            this.handleLocationChange = function() {
                self.close();
            };

            // more functions
        }

我推测handleLocation(和其他函数)是在构造函数体内而不是原型中声明的,原因如下:

var eventSystem={
  events:{},
  add:function(eventname,fnCallback){
     if(!this.events[eventname]){
      this.events[eventname]=[];
     }
     this.events[eventname].push(fnCallback);
  },
  trigger:function(eventname){
    if(!this.events[eventname]){
      return;
    }
    var i=0;
    for(i=0;i<this.events[eventname].length;i++){
      this.events[eventname][i]();
    }
  }
};

var person=function(name){
  this.name=name;
};
person.prototype.sayName=function(){
  console.log("this is now:",this.toString());
    // logs this is now: function (){ console.log("this is now:...
    // so this is now the sayName function not the person instance
  console.log(this.name);//undefined: sayName doesn't have a name property
}
var jon=new person("jon");
eventSystem.add("sayname",jon.sayName);//add event and listener function
eventSystem.trigger("sayname");//trigger the event

以下是如何解决设置闭包引用

的问题
var eventSystem={
  events:{},
  add:function(eventname,fnCallback){
     if(!this.events[eventname]){
      this.events[eventname]=[];
     }
     this.events[eventname].push(fnCallback);
  },
  trigger:function(eventname){
    if(!this.events[eventname]){
      return;
    }
    var i=0;
    for(i=0;i<this.events[eventname].length;i++){
      this.events[eventname][i]();
    }
  }
};

var person=function(name){
  var self=this;// set closure ref to this
  this.name=name;
  this.sayName=function(){
    console.log(self.name);//use closure ref to get this
       // logs jon
  }
};
var jon=new person("jon");
eventSystem.add("sayname",jon.sayName);//add event and listener function
eventSystem.trigger("sayname");//trigger the event

0 个答案:

没有答案