Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4734219
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类:

2010-09-11 15:28:27

JS与AAuto语法比较(面向对象部份)

JS与AAuto语法比较(面向对象部份)

参考:

概述

Javascript在web编程、网页编程中是最重要的一种客户端脚本语言,而在AAuto程序设计中,他又具有了一些新的应用,例如Web UI界面设计,通过AAuto也扩展了Javascript的本地化编程应用,而Javascript也很好的扩展了AAuto的功能。

Javascript、AAuto的语法都是基于C系语法,而且同是动态语言,语法特性非常接近。而在AAuto的Web编程中,Javascript可能是大家接触最多的语言。了解两种语法的异同有助于同时加深对Javascript,AAuto两种语言的理解。

本文适合至少熟练掌握这两种语言中其中一种的用户,如果你熟悉Javascript或AAuto,本文将有助于你快速的掌握另外一种语言.

AAuto与Javascript的语法差异主要表现在面向对象有关的一些语法上。
下面我们以此为重点介绍两种语言在实现面向对象特性时的一些语法区别.

参考资料:

数据集合

在AAuto中表示数据集合只有一种对象,即,table对象不但可以包含键值对,而且可以包含数组,所有成员放在大括号中,并用分号分隔。

AAuto用大括号表示集合,无论是指令集合(语句块),还是数据集合(table)
并且使用分号分隔元素,无论是指令元素(语句),还是数据成员(table成员)
保持语法的简洁,和概念一致性。

例如:

//AAuto代码:

var tab = { 123;456;789; name = "张三"; gohome = function(){ io.print("I'm back") } } io.print( tab.name ) //显示 张三 io.print( tab[1] ) //显示123

 

而在Javascript,分为对象直接量(包含键值对的哈希表),以及数组。

对象直接量用冒号分隔键值对,而使用逗号分隔成员,例如

//Javascript代码

var tab = { name:"张三", gohome:function(){
document.write("I'm back") } } document.write(tab.name); //显示 张三

上面的冒号用的有些怪异,在AAuto中取而代之的是等号.

数组则放在中括号中,并使用逗号来分隔。

//Javascript代码

var tab = [123,456,789] document.write(tab[1]); //显示 123

Javascript中没有明确类的概念,也没有相关的语法关键字,而普通的对象,函数可都以模拟类的作部份功能.
用new关键词创建对象的副本,实际上这种过于的自由,一定程度上增加了学习理解、记忆的难度,新手要完全理解JS的面象对象机制有一定的难度.

用普通数据对象模拟类的实现

//Javascript代码

var test = {} test2 = new test;

AAuto中并不认为table对象是类,仅仅是提供了简单的深拷贝函数复制table对象,如下:

//AAuto代码:

var test ={} test = table.copy(test)


如:用函数来模拟实现类,你如果习惯使用传统语言,可能有些难以理解,实际上你可以当他是一个类的构造函数.这种隐晦的传递语义的语法实际上降低了代码的可读性.

//Javascript代码

function myclass(){ this.name = "张三"; this.getName = function(){ return this.name; } this.setName = function(name){ this.name = name; } }

在构造函数中,使用this表示创建的对象实例(每次运行构造函数会创建不同的对象实例)
这一点与AAuto非常相似,在AAuto的构造函数中,同样可以使用this访问对象实例.

//AAuto代码:

class myclass{ ctor( ){ //ctor定义类的构造函数 this.name = "张三"; this.getName = function(){ return this.name; } this.setName = function(name){ this.name = name; } }; //下面的这样增加类实例成员的方法,javascript是不支持的 age = 23; gohome = function(){ io.print("I'm back") } }

除了使用this关键字表示实例对象与javascript一致以外.
AAuto显示的定义一个类,并可以显式的定义类的实例成员,语法更为接近传统编程语言.

原型表

javascript可以使用prototype指定对象的原型表

例如:

//Javascript代码

function myclass(){ this.name = "张三"; } myclass.prototype.sex = "男" ;//成员变量 myclass.prototype.getName = function(){ //成员方法 return this.name; }

prototype就是一个表,下面的代码也可以写成下面这样:

//Javascript代码

function myclass(){} myclass.prototype = { name:"张三", sex:"男", getName:function(){ return this.name; } };


区别是放到了一个表里,并且把等号变成了冒号.

而在AAuto中可以为一个对象指定元表,元表中的_get元方法则可指定一个原型表.
元表较多JS中的原型表功能更多一些,不便可以指定原型表,还可以自定义一些对象的行为,重载操作符等等.
请参考:

我们可以用AAuto实现JS中的prototype功能.如下:

//AAuto代码:

class myclass{ ctor( ){ }; @prototype; }
myclass.prototype._get = { name="张三"; sex="男"; getName=function(){ return this.name; }; }

AAuto中的元表可以实现一些更强大的功能,例如属性表:

//AAuto代码:

import util.metaProperty class myclass{ ctor( /*输入构造函数所需要的参数*/ ){ }; @metaProperty; } myclass.metaProperty = util.metaProperty( 属性 = { _get = function(){ /*读取属性代码写在这里*/ return null; } _set = function( value ){ /*写入属性代码写在这里*/ ..io.print( owner,value) } }; @{ _get = ..父属性表 } /*属性表可继承*/ )

属性表在AAuto标准库中的应用非常多,例如win.ui.ctrl库.

静态方法

一个类创建的所有对象都可以访问的方法称为静态方法.对于一个类,静态方法只有一个实例.不会因为创建新对象而创新建新的静态方法.

AAuto与JS使用静态方法的语法是一样的,都是在类名后直接跟上静态成员的名字,例如:

类名.静态成员名字

而在C++语言里,也有类似的语法,用::代替.表示静态成员,例如:

类名::静态成员名字

总之跟在类名后面的成员是静态成员,跟在对象名字后面的是实例成员,这在大多数语言中都一致.

继承

javascript通过prototype实现继承

//Javascript代码
function parent(){ this.familyname = "张" this.name = "张三他爸" this.getFamilyName = function(){ return this.familyname; } }
function child(){ this.name = "张三"; } child.prototype = new parent();//注意要用new

而在AAuto里继承的方法比较多,一种是类似上面的将原型表指定为父类构建的实例,称为间接继承.

也可以使用更简单的直接继承,如下:

//AAuto代码:

class parent{
    familyname = "张";
    name = "张三他爸";
    getFamilyName  = function(){
        return this.familyname;
    }
}

class child(){
	ctor(){
		this = ..parent()
	}
    name = "张三";
}
child.prototype = new parent();//注意要用new

名字空间

在Javascript里对名字空间的支持非常有限,
而AAuto有非常完整的模块化、名字空间机制,在AAuto中每个类有自已的名字空间,类的名字空间里的成员也是类的静态成员.请注意这方面的差异,具体请查看:

阅读(1738) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~