WEB开发网
开发学院网页设计JavaScript JS.Class - 2. Methods & Types 阅读

JS.Class - 2. Methods & Types

 2009-10-13 00:00:00 来源:WEB开发网   
核心提示:说实话,在 JavaScript 里玩 object-oriented 感觉像坐过山车,JS.Class - 2. Methods & Types,晕晕乎乎的,那个可以被称为 "上帝金手指" 的 this 会随时玩出一些魔法来,我们修改一下上面的调用方法,varo=newMyClass();

说实话,在 JavaScript 里玩 object-oriented 感觉像坐过山车,晕晕乎乎的。那个可以被称为 "上帝金手指" 的 this 会随时玩出一些魔法来,要永远记住它指向的是 "调用者",而不一定是对象实例本身。

var MyClass = new JS.Class(
{
  test : function(o)
  {
    alert(o == this);
  }
});
var o = new MyClass();
var func = o.test;
o.test(o); // true
func(o); // false

你可能想当然认为 func 是 o.test 的指针…… 嗯,这么说也没错。只不过一旦执行 func(o),其方法体内部的 this 就不再代表实例引用 o,而是 func() 的调用者 BOM。因此 o == BOM 的结果自然是否定的。正由于这种 "奇怪" 的特性,使得 this 的使用往往变成一个误区和灾区,作为最常用的 function callback,某些时候只有老天才知道为啥出现奇怪的结果。

很显然,JS.Class 的作者是个细心的人,他了解像我这种习惯 "严谨" 的古董有很多,因此他为对象提供了一个 method() 方法来改善这个问题。OK,我们修改一下上面的调用方法。

var o = new MyClass();
var func = o.method("test");
o.test(o); // true
func(o); // true

世界正常了。当然它对静态方法同样有效。

var MyClass = new JS.Class(
{
  extend :
  {
    test : function()
    {
      alert(this == MyClass);
    }
  }
});
MyClass.test(); // true
var func1 = MyClass.test;
func1(); // false
var func2 = MyClass.method("test");
func2(); // true

编缉推荐阅读以下文章

  • JS.Class - 3. Modules & Mixins
  • JS.Class - 1. Classes & Inheritance

1 2 3  下一页

Tags:JS Class Methods

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接