imjacob的专栏

首页博文目录订阅
正 文

Tutorial:关于JavaScript的 貌似类(pseudo-classes)

(2008/11/17 20:24)
Tutorial:关于JavaScript的 貌似类(pseudo-classes)----不吐不快 From Learn About the Ext JavaScript Library Jump to: navigation, search
Summary: 关于David flanagan的人们怎么称呼JS的“貌似类(pseudo-classes)”的一博客,我有一大堆话要说,发表评论就不必了,我会在这里说。
Author: Zwetan Kjukov (译者:Frank Cheung)
Published: 2007-06-02
Ext Version: any
Languages: cn.png Chinese

关于David flanagan的人们怎么称呼JS的貌似类(pseudo-classes)的一博客,我有一大堆话要说,发表评论就不必了,我会在这里说。

ECMAScript里面是没有类的,这点在 ECMA-262 规范里说得非常清楚。

4.2.1 Objects ECMAScript does not contain proper classes such as those in C++, Smalltalk, or Java, but rather, supports constructors which create objects by executing code that allocates storage for the objects and initialises all or part of them by assigning initial values to their properties.

All constructors are objects, but not all objects are constructors.

Each constructor has a Prototype property that is used to implement prototype-based inheritance and shared properties.

这就是该帖子我起名字”不吐不快“的原因,对于清晰和精准地理解ECMAScript的语言机制是没有帮助的。

过去几年累积了不少ActionScript经验的我,现在看来这种的术语简直是混乱(mess caused by bad terminology)。

要列举这种混乱,从Flash5说起,那时MM公司是用ECMA-262实现ActionScript的,然后到Falsh7的时代,它们升级到ActionScript 2,基于ECMAScript4提案(未完成的)。

他们这样做的原因是因为他们想把”专业的“感觉赋予他们的软件,以吸引来自Java /C#等等环境的开发者。

结果令到人们相信ActionScript是真正的Class-Based语言,而不会去想他们的代码为 prototype-based(基于原型的) ,他们认为这样,仿佛就好像在编程Java或一些class-based一样。

这是彻底的错误 THIS IS PLAIN WRONG.

首先,我认为从一个未完成的草案,就去实现一门语言,是不负责的。只会引发前所未知的语言兼容性,从ActionScript和JScript.NET两个实现的差异有多大,就可以看出这种兼容性的问题,尽管都是来自同一个的草案。

第二,ECMA-262我们知道是基于原型的语言,也可以模拟class的行为,自身砍掉class-based本来没有的功能会有什么用呢?(译注:指原型的功能是“独有的”)

我给出一个我经历过的怪诞的例子,人们会把Java的思维方式放到ActionScript2:单列模式http://c2.com/cgi/wiki?SingletonPattern

这里是人们在ActionScript2实现该模式

class Singleton
    {
    private static var _oInstance:Singleton;
  
    private function Singleton() {}
  
    public static function getInstance():Singleton
      {
      if(_oInstance == undefined)
        {
        _oInstance = new Singleton();
        }
    
      return _oInstance;
      }
  
    public static function release():Void
      {
      if(_oInstance)
        {
        delete _oInstance;
        }
      }
  }

没错,他们是COPY JAVA的;是的,这并不对,这样做并不是Java不对,而是错在ECMAScript不是一个Class-based语言(正如边注所说, ActionScript2 不是真正的Class-based语言,只是写法上的Class-based)

基于原型的语言你所接触的是 对象 层次(work on the object level),你不需要为创建某个对象的实例去定义一个类,只是创建一个对象直接分配方法和属性即可。

  Singleton = {};

  Singleton.someProp = 12345;

  Singleton.someMethod = function( /*Number*/ num ){
      return this.someProp + num;
  }

那就是区别了,在java中得到单例,要实例化它,除了用class没有其它的方法。所以,在不规定的过程中,要保证该类只是实例化过一次,你会被规定使用类的getInstance方法,或类似的机制。

但是在ECMAScript中,你不需要为独一无二的对象实例化,你只需声明一下,因为你不需要 类 来实例化(甚至 构造器constructor),并向你保证这的确是独一无二的。

再引用:

 not all objects are constructors

在ECMAScript中用正确的术语是很重要的(译注:溯本清源???),使得人们不会用class-based的概念理解,也不会在相同的逻辑(如java)上犯糊涂。


你思考这些的代码时,尽可能不用class理解,而用对象去理解,理解这些对象,仅仅是字面上的理解,或有别于 class-based语言的内建构建函数创建出来, 又或者“当”它们是一样的,只是依靠内部机制创建而已,--但根本不一样。


欲真正理解基于原型的机制,请阅读论文解释细节: http://www.idt.mdh.se/kurser/cd5130/msl/2005lp4/downloads/reports/prototype_based_languages.pdf

基于原型的语言的中心思想,是允许创建不需要类的对象,因此,请恕我直言,在ECMAScript之内不要使用 类 的术语。

References: Prototype based languages Billborn and Mallela Srinivasa Rao PDF(if this document get moved, contact me to have a copy, I keep everything :)) Raising Hell http://www.vh1.com/artists/az/run_dmc/77028/album.jhtml Run-D.M.C. - Raising Hell (1986/1/1)

原文出处:http://burrrned.zwetan.com/2005/08/raising-hell.html

Retrieved from "http://extjs.com/learn/Tutorial:%E5%85%B3%E4%BA%8EJavaScript%E7%9A%84_%E8%B2%8C%E4%BC%BC%E7%B1%BB%EF%BC%88pseudo-classes%EF%BC%89%EF%BC%8D%EF%BC%8D%EF%BC%8D%EF%BC%8D%E4%B8%8D%E5%90%90%E4%B8%8D%E5%BF%AB"
  • This page was last modified 09:20, 12 August 2008.
  • This page has been accessed 810 times.

评 论
还没有网友评论,欢迎您第一个评论!
博 主
进入imjacob的首页
博客名称:雅克的一府
日志总数:513
评论数量:853
访问次数:1879930
建立时间:2006/11/23 20:52
导 航
公 告
Locations of visitors to this page 本博客主要用于个人学习与资料收藏。当然大家应该读了之后也能学到不少东西。其中大多数资料都是来自网络,我转载时尽可能地表明文章出处与原作者姓名,但由于很多资料经多人转载,已不清楚原作者信息与出处,所以未表明相关…
评 论
链 接

ARM+LINUX 嵌入式博客
http://blog.chinaunix.net/u1/58780/index.html

嵌入式软件
http://blog.csdn.net/embeddedsoft

诚诚恳恳做人踏踏实实编程
http://blog.sina.com.cn/u/1244756857 

和我风格相似的一个blog
http://blogger.org.cn/blog/m…