JS.Class - 2. Methods & Types


说实话,在 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
另外一个实用的方法就是 Singleton 了,最常用的模式之一,不是吗?要知道 JavaScript 可没有 private 访问修饰符,我们无法弄一个 private initialize() 出来。

var User = new JS.Singleton(
{
  name : "User",
  print : function() { document.write(this.name + "<br />"); }
});
//var o = new User();
User.print();

  这样用来,你无法用 new User() 来创建对象实例,它会导致一个错误。

  Microsoft JScript 运行时错误: 对象不支持此操作

  当然,我们也可以让继承类变成 Singleton。

var User = new JS.Class(
{
  name : "User",
  print : function() { document.write(this.name + "<br />"); }
});
var Manager = new JS.Singleton(User, {});
var o = new User();
Manager.print();

  既然有了类和继承,那么 Type 的相关操作就是必须的了。要知道 JavaScript 的变量是无类型的,某些时候我们必须验证一些危险分子的身份。

var User = new JS.Class({});
var Manager = new JS.Class(User, {});
var o = new Manager("Tom");
alert(o.isA(Manager));
alert(o.isA(User));

  很典型的 C# is 关键字的用法,isA 很好地支持了继承体系。

var User = new JS.Class({});
var Manager = new JS.Class(User, {});
var o = new Manager("Tom");
alert(o.klass == Manager); // true
alert(o.klass.superclass == User); // true

klass 其实就是 class (class 是 JavaScript 保留字),它指向类型对象,有点类似 C# GetType()。我们还可以用 superclass 找到其基类。

  利用 klass 我们可以做更多的事情,比如说调用静态成员。很显然,某些时候(比如类库或重构)比直接用 User.test() 这种硬编码要好些。

var User = new JS.Class(
{
  extend : 
  {
    test : function() { alert("Test!"); }
  }
});
var o = new User();
o.klass.test();

  继续玩点有深度的,找出所有的子类,并创建实例。

var User = new JS.Class(
{
  name : "User",
  print : function() { document.write(this.name + "<br />"); }
});
var Manager = new JS.Class(User, { name : "Manager" });
var System = new JS.Class(User, { name : "System" });
var o = new User();
for(var i in o.klass.subclasses)
{
  var k = o.klass.subclasses[i];
  new k().print();
}

  JS.Class 甚至允许我们创建 Interfaces,这很奇怪不是吗?不过它并不是我们通常所理解的那种接口,它只是一个约束,用来检查某个对象是否包含接口所指定的成员。

var IUser = new JS.Interface(["print", "test"]);
var User = new JS.Class(
{
  name : "User",
  print : function() { },
  test : function() {}
});
var o = new User();
JS.Interface.ensure(o, IUser);


  有点遗憾的是它只能测试实例方法,而不管静态方法和字段成员。当然,只有在测试没通过的时候,你才看到 JS.Interface.ensure 的效果。

Microsoft JScript 运行时错误: object does not implement name()

  可以测试对象是否实现了多个接口。

JS.Interface.ensure(o, IUser, IOther...);

 



相关阅读:
设计视图中允许的九种数据类型
一直都需要的复制到系统剪贴板之IE,firefox兼容版
JavaServer Page(JSP)简介
数据字典表Truncate掉将导致数据库不可用
javascript asp教程 日期相关
Javascript 模式实例 观察者模式
JavaScript面向对象的两种书写方法以及差别
ACCESS数据库向MySQL快速迁移小程序(一)
Linux fgetcsv取得的数组元素为空字符串的解决方法
IE7,IE8 BUG导致CSS下载二次的解决方法
javascript打开新窗口同时关闭旧窗口
网页排版经常用到的5个CSS基础
PHP下ereg实现匹配ip的正则
Win2000/XP中多种建立隐藏超级用户的方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 未来的汽车 家长对孩子们的寄语 骨干教师教育信息化培训学习工作总结 有一天我会为一个人,卸下我的面具 给书籍一个拥抱 破碎的水杯 破碎的爱情 电力企业营销部主任演讲稿 镇党委2009年度组织工作总结 中秋的月夜 唯美伤心句子 心里的痛又有谁能感觉到 入党积极分子申请书范文2016年2月 “坏学生”成大器的8种能力 校报稿件:实现自我价值 网络搞笑短信25 人教版高三上期中---山东昌邑一中2004-2005学年度上学期期中考试 地球只有一个作文800字 小学三年级作文250字:Mark Twain 慎重对待第一份工作_职场励志 没有人会比我更爱你 游水天花月作文300字 成长的青果子_关于成长的初中作文800字 初中生300字周记 2014年小学一年级650字军训作文篇:珍藏在心底的回忆 小学六年级作文550字:意气 【精品】2014年执法人员年终总结 友情让我坚持作文700字 给上级的经典祝福语 有关圣诞节礼物的作文:我的圣诞节礼物 2015幼师国培研修总结 李嘉诚:行动英雄 愤怒的小金鱼700字 《春夏秋冬》观后感 作文500字 2014新年趣事作文600字 国庆农家乐作文 温岭洞下沙滩游记 墨染流年,风清云淡 读《傅雷家书》有感 别失去心痛 重阳节活动 小学教学教研工作管理制度 2015酒店员工辞职报告书 海滨三小 “迎元旦 秀风采”诗歌朗诵展示活动方案 形容人生气的好句子 他说,D,我记住你的名字了 以“起点”与“终点”为话题作文 金瞳公主的平民日记1 中学教师风采个人简介 陌生..... 领导班子成员履职工作总结 告诉自己只是梦

Copyright © 2016 phpStudy |