随笔-312  评论-11907  文章-2  trackbacks-224

作者:Dflying Chen http://dflying.cnblogs.com/

JavaScript是一门非常强大的基于对象(Object Based)的语言,但是对面向对象(Object Oriented)的支持还存在一些不足,同时JavaScript内建的类库也比较简单,甚至缺乏一切很常用的功能。ASP.NET Atlas在运行时扩展了JavaScript,大大增强了它的面向对象支持能力,并扩展了一些开发时常用的操作。

我参考了一下Atlas.js文件,总结出AtlasJavaScript有如下扩展。某些地方有所遗漏或错误,还请各位包涵并指正。

String对象的扩展

  1. String String.ltrim()
    移除原String开头部分所有的空格,并返回一个新String对象。
  2. String String.rtrim()
    移除原String结尾部分所有的空格,并返回一个新String对象。
  3. String String.trim()
    移除原String开头和结尾部分所有的空格,并返回一个新String对象。
  4. Boolean String.endsWidth(strEnd)
    String是否以传入的String结束。
  5. Boolean String.startsWith(strStart)
    String是否以传入的String开始。
  6. String String.format(args1,args2,.)
    类似于C#中的String.Format(),被操作的String中的{n}将被代替为相应的第n个参数,并返回一个新String对象。
  7. String String.removeSpaces()
    移除原String中的所有空格,并返回一个新String对象。
  8. String String.removeExtraSpaces()
    将原String中连续的空格置换成单一的空格(包括回车),并返回一个新String对象。
  9. String String.removeSpaceDelimitedString(str)
    将原String中的指定单词(被空格分开的文字片断)移除,并返回一个新String对象。这个方法可以用在删除包含多个class名称DOM元素的某个class名称时候。

Array对象的扩展

  1. void Array.queue(objValue)void Array.add(objValue)
    将指定的objValue插入到该Array的末端。
  2. void Array.addRange(rangeArray)
    将指定的rangeArray加入该Array的尾部。
  3. Boolean Array.contains(objValue)Boolean Array.exists(objValue)
    返回布尔值,代表该Array是否包含objValue项目。
  4. Array Array.clone()
    返回该Array的一个浅拷贝副本。
  5. void Array.insert(index, objValue)
    将指定的objValue插入到该Arrayindex位置。
  6. Object Array.dequeue()
    移除并返回该Array中的第一个条目。
  7. Object Array.removeAt(index)
    移除并返回该Array中指定的index的条目。
  8. Boolean Array.remove(objValue)
    移除该Array中指定的objValue条目,返回布尔值代表该条目是否存在并被成功移除。
  9. Array Array.parse(string)
    将传入的以string表示的Array解析成Array
  10. void Array.clear()
    清空该Array中的所有条目。
  11. Integer Array.get_length()
    返回该Array的条目数,等同于Array.length
  12. Object Array.getItem(index)
    返回该Array中指定index的条目。

Date对象的扩展

  1. String Date.toFormattedString(stringFormat)
    依照输入的stringFormat格式化并输出该Date对象(format string太多了……懒得写了,需要的直接看Atlas.js748-871行好了)。

Number对象的扩展

  1. Number Number.parse(string)
    尝试解析传入的stirngNumber
  2. String Number.toFormattedString(stringFormat)
    依照输入的stringFormat格式化并输出该Number对象(format string还是太多了……懒得写了,需要的直接看Atlas.js935-1024行)。

Sys.StringBuilder类

类似于C#中的StringBuilder

var sb = new Sys.StringBuilder();
sb.append(
"<div>");
sb.appendLine(
"a line of text");
sb.append(
"</div>");
someDOMElem.innerHTML 
= sb.toString();

面向对象的支持

定义可以被继承的基类

BaseClass = function()
{
    
// object
}

BaseClass.registerClass(
"BaseClass");

继承类

DerivedClass = function()
{
       
// Call base constructors
       // The 2nd argument is an array you can use to pass arguments
       DerivedClass.intializeBase(this,arguments); 
}

DerivedClass.registerClass(
"DerivedClass","BaseClass");

多重继承

MultipleInherit= function()
{
MultipleInherit.intializeBase(
this,arguments); // bootstrap
//
 object
}

MultipleInherit.registerClass(
"MultipleInherit",["BaseClass""DerivedClass"]);

定义可被覆写(override)的方法

BaseClass = function()
{
    
// object
    this.initialize = function()
    
{
    }
   
    BaseClass.registerBaseMethod(
this,"initialize");
}

BaseClass.registerClass(
"BaseClass");

调用基类被覆写的方法
DerivedClass = function()
{
       DerivedClass.initializeBase(
this,arguments); // bootstrap
       this.initialize = function()
       
{
              DerivedClass.getBaseMethod(
this,"BaseClass","initialize").call(this);
              
// To pass arguments to base class:
              // .call(this,args1,args2,args3)
       }

}

DerivedClass.registerClass(
"DerivedClass",["Atlas.Bindings.Base","BaseClass"]);

名称空间

registerNamespace("Web.Utility");
// Implement Web Utility
registerNamespace("Web.Performance");
// Implement Performance

定义Enum类型
var theEnum = Type.createEnum("name1","name2");
for (var strItems in theEnum.getValues())
{
}

定义Flag类型

var theFlags = Type.createFlags("name1",value1,"name2",value2,);

 

posted on 2006-05-01 22:26 Dflying Chen 阅读(4637) 评论(34)  编辑 收藏 所属分类: ASP.NET AJAX (Atlas)

评论:
#1楼  2006-05-02 01:18 | web [未注册用户]
registerClass

getBaseMethod

是js本身有的函数,还是扩展阿?

能否详细的介绍一下这两个函数的作用和原理吧?
  回复  引用    
#2楼  2006-05-02 08:25 | 大剑师      
调用基类被覆写的方法:
DerivedClass.getBaseMethod(this,"BaseClass","Init").call(this);此行是不是笔误啊,我觉得应该是
DerivedClass.getBaseMethod(this,"BaseClass","initialize").call(this);
  回复  引用  查看    
#3楼 [楼主] 2006-05-02 08:59 | Dflying Chen      
@大剑师
确实如此,谢谢您的指正!
  回复  引用  查看    
#4楼 [楼主] 2006-05-02 09:05 | Dflying Chen      
@web
这些都是Atlas的扩展。
顾名思义,registerClass用来注册一个类,getBaseMethod用来取得父类中的方法。
关于具体实现,也非常简单,您可以参考Atlas.js文件的前面几行:)
  回复  引用  查看    
#5楼  2006-05-02 09:22 | @@@ [未注册用户]
@Dflying Chen
这些有什么用?!
sh**,建议不要搁首页.
  回复  引用    
#6楼  2006-05-02 09:26 | 一恒 [未注册用户]
在这个方面, 我觉得没有pototype.js精巧. 入门级的人要了解Atlas是怎样实现继承, 比
pototype.js要花更多时间.

也许做大了就必然有所失,正所渭"亢龙,有悔".
  回复  引用    
#7楼  2006-05-02 09:36 | 一恒 [未注册用户]
上面打错了,应该是prototype.js,

我做了一下比较,$()

atlas:

function $(elementID) {
return document.getElementById(elementID);
}

prototype.js:

function $() {
var elements = new Array();

for (var i = 0; i < arguments.length; i++) {
var element = arguments[i];
if (typeof element == 'string')
element = document.getElementById(element);

if (arguments.length == 1)
return element;

elements.push(element);
}

return elements;
}

可以讲prototype现实更为完美.

  回复  引用    
#8楼 [楼主] 2006-05-02 09:36 | Dflying Chen      
@@@@
这些是ASP.NET Atlas的内容,虽然有些基础了点,但是考虑到中文的Atlas资料还不是很多,我就发了出来。
至于首页,我觉得我的每篇文章都是认真写的,虽然水平有限,但是不至于很差。还是会有一些帮助的吧。如果朋友们都说这样的文章不要放在首页,我也就不放了。
  回复  引用  查看    
#9楼 [楼主] 2006-05-02 09:37 | Dflying Chen      
@一恒
prototype比较小巧,Atlas关注的方面比较多。
二者的目标不一样。
  回复  引用  查看    
#10楼  2006-05-02 09:41 | 一恒 [未注册用户]
只要是原创,都应放在首页, 要不谁来刷新版面呢?
  回复  引用    
#11楼 [楼主] 2006-05-02 09:42 | Dflying Chen      
@一恒
呵呵,prototype中允许传入Array作为参数,并一下子返回一个Array结果,当然实现起来和Atlas不一样了:)
  回复  引用  查看    
#12楼 [楼主] 2006-05-02 09:42 | Dflying Chen      
@一恒
谢谢支持o:)
  回复  引用  查看    
#13楼  2006-05-02 10:19 | 瓶子      
只要是原创,都应放在首页, 要不谁来刷新版面呢?
这点是要支持的!
  回复  引用  查看    
#14楼 [楼主] 2006-05-02 10:30 | Dflying Chen      
@瓶子
其实也不见得吧,如果太过于简单了或是没有新意的老话题,也没什么必要。
  回复  引用  查看    
#15楼  2006-05-02 13:23 | xilihwala      
Dflying Chen兄的ALTAS文章当然要放首页啦
  回复  引用  查看    
#16楼 [楼主] 2006-05-02 14:28 | Dflying Chen      
@xilihwala
谢谢支持
  回复  引用  查看    
#17楼  2006-05-02 17:59 | 瓶子      
也许吧!BLOG精神本来就大众写作滴么.只要作者想,也没多少有碍旁观.
放不放'首页'全凭个人爱好么...

  回复  引用  查看    
#18楼 [楼主] 2006-05-02 22:35 | Dflying Chen      
@瓶子
呵呵,也要适当考虑一下,不能随便放啦
  回复  引用  查看    
#19楼  2006-05-03 21:53 | headchen [未注册用户]
写得很好。
补充一些:

1. javascript试基于原型prototype的继承机制,通过构造函数和原型对象来模拟类。这一点在Atlas中当然不会发生改变。只不过他在暗地里全都处理了,处理得方法是:派生类拷贝了基类原型对象得所有方法到自己得原型对象中。这样当一个派生类继承于一个基类时,自动继承类通过原型对象实现得实例方法(当然派生类的原型对象中若存在同名方法,则不拷贝)。

2. Atlas通过registerBaseMethod来声明得虚方法仅仅时构造函数得内部方法(有一些文档中称为privilege方法,意思时能够访问构造函数得局部变量,Atlas正是通过这个来模拟私有变量的)。而Atlas中大量的get_ set_正是此类方法。

3.在javascript中实现一个类的实例方法有两种途径:1 把方法定义在原型对象中,这个在使用时自动通过访问原型链来访问实例的方法。这种方式的好处是节省内存,效率比较高(这里说的效率是实例化对象时的效率),因为多个实例的方法都存在一个原型对象中。2 定义为原型对象的内部方法(上面已经说过来),这种方式,在初试化实例对象时,实际上是给每个对象实例都定义了一个相应的方法。所以初试化实例对象时需要更多的内存和时间。但这种实现方式有他存在的必要性,那就是利用函数的closure特性来实现特有的需求,比如:生成事件委托,回调函数,实现局部变量等等。但如果对象实例很多时,存在很大的效率问题,所以把他称为privilege方法也时有道理的,那就是他的存在的理由就是为来利用closure。

微软在Atlas种大量使用privilege方式来实现实例方法,而有意无意的淡化来javascript固有的prototype的实现方法,从语法上来看更接近C#的语法,另外Atlas种存在大量的get_ set_ 类方法也只能通过这种方式来实现,我们也看到绝大多数类实例的方法,即使不是必须,也大多采用类这种实现方式,而不是prototype的方式。对于这种动向,本人时持有反对意见的。很明显的看出:Atlas有.net情结。想在javascript环境实现一个稳固严密的架构,但确牺牲了javascript原有的灵活性,并且牺牲了大量的内存和效率。

所以我们可以利用Atlas提供的一些扩展,比如对于String Array Function等的扩展,特别时命名控件,事件委托等等。但不必完全拘役于它或者完全模仿他。

请大家批评。


  回复  引用    
#20楼 [楼主] 2006-05-03 22:11 | Dflying Chen      
@headchen
您对JavaScript理解很深刻,我同意应该尽可能的选择prototype实现扩展。而且通过我对Atlas源代码的观察,String Array Function等的扩展大多确实使用了prototype的形式,也正是您所推荐的方式。
再次感谢您如此认真的交流!
  回复  引用  查看    
#21楼  2006-05-04 14:44 | kane      
good~
  回复  引用  查看    
#22楼 [楼主] 2006-05-04 17:32 | Dflying Chen      
@kane
:)
  回复  引用  查看    
#23楼  2006-05-05 16:30 | headchen [未注册用户]
Atlas对Function,Array,String的扩展是通过prototype来扩展的,这也是javascript中的唯一的选择,也是Atlas的基础性的建设。我说的Atlas内部函数的倾向是指架构中类(class)以及继承等的实现。可以看出,在Atlas中除了对Function,Array,String,Date的扩展和对Event的实现外,其他类的实现均是通过内部函数的方式,而不是prototype的方式,前面我说过,内部函数的方式有存在的必要性,但除非必要(比如你要实现一个供setTimeout使用的回调函数等),在javascript中对类实例的方法的标准实现是通过prototype的,这是ECMAScript的规范。当然不是说通过内部函数的方式实现不可以,就是存在内存和效率问题,如果一个类的实例可以预见到不是很多,则无所谓了。如果比较多的话,问题就来了。

我认为,在Atlas的客户端脚本中存在的某些倾向有一定的问题:
1. 为了语法的完整大量采用内部函数来实现类方法,前面已经说的够多的了。
2. 过份强调了严密性而放弃了灵活性和效率。典型的就是对对象属性的实现方式。大量采用了get_ set_ 这样的内部函数。就其好处,当然首先保证了私有变量安全,另外可以对属性的值进行校验,便于扩展,还有就是可以触发事件或者其他的联动计算来保证数据的完整性。另外在解析xml脚本时保证来对属性访问的合法性。PME的概念在.net中可以说时很普遍,也是C#,VB.net等语言固有的特性,但这些并不是javascript固有的特性,可以说javascript语言从设计到发展到标准化(ECMAScript)都不是这个方向,从将来的趋势来看也没有这种趋势。因为客户端脚本的目标和一个编译性语言时不同的,他的特点时简洁、灵活、强大,他存在于宿主环境中,他最主要的目标是操作宿主对象,所以对自身的面向对象的特性方面要弱一些,而且并不严密,存在很多不足。若非要那他来建立一个“坚固”的客户端脚本环境,我不会看好这个方向,或许微软把Jscript.net强制放在IE环境下会比在jscript中磕磕绊绊地模拟好一些,但这是不可能的。要我来说的话,那些大量的set_ get_ 还是扔了吧,尽管他有不少好处,但和付出的代价来说,太不划算了。

Atlas的抱负可能太大了一些,依我看,照此路发展下去(不仅仅是客户端脚本),很难成功。当然对于微软来说,没有什么是不可能的,我们还是拭目以待吧。
  回复  引用    
#24楼 [楼主] 2006-05-05 18:02 | Dflying Chen      
@headchen
确实如此,您的分析入木三分。实际项目中我已经见识到Atlas的低效了……Atlas的客户端脚本在越变越大,Atlas的自定义Control也越来越复杂……照此发展下去,到底怎么样也是不可预料的。
Microsoft也有好多不成功的产品,我也有一种感觉那就是Atlas也将步其后尘……其实这是很无奈的,但是连Microsoft内部的产品都只用了一点点Atlas的功能(精简版),让我不能不产生这样的想法。
让JavaScript担当Rich Web Application的Client端协调重任,本身也是对JavaScript的一种过高要求。或许这仅仅是一个过渡技术,但考虑到众多的浏览器用户,JavaScript还不会很快被其他代替。
Microsoft是让Atlas以客户端开发Framework的王者身分出现的,然而尾大不掉,现在还很难说Atlas会走向何方……
  回复  引用  查看    
#25楼  2006-05-09 03:20 | lonelystranger [未注册用户]
目前还是静观发展为好
  回复  引用    
#26楼 [楼主] 2006-05-09 08:33 | Dflying Chen      
@lonelystranger
呵呵,作为开发人员,自然不用着急,但是研究人员应该有所关注。
  回复  引用  查看    
#27楼  2006-05-17 18:49 | er      
# re: 去除代码行号的一个小程序(控制台版本) 2006-05-17 18:47 | er

very good


__ - - - - - - - -- - - -- - - -- - - - - -- - -- -- - - -

http://www.ting58.cn
http://www.ybaor.cn
  回复  引用  查看    
#28楼  2006-06-05 11:05 | 宇宙工业机器 [未注册用户]
@Dflying Chen
我对JavaScript不是太了解,只是略知皮毛,没有系统学习过基础。一些语法不是太明白,请问在Atlas.js中的一些问题:
Function.abstractMethod = function() 是什么意思,它的调用流程是怎么办的啊?
Sys.INotifyPropertyChanged = function() 接口又是怎么实现?
javascript中的所谓prototype(原型)又是什么概念啊?与设计模式中的prototype又有什么区别?
  回复  引用    
#29楼 [楼主] 2006-06-05 12:42 | Dflying Chen      
@宇宙工业机器
您可以参考一下JavaScript的相关书籍阿,这些讲起来就太多了 :)
  回复  引用  查看    
#30楼  2006-06-20 22:06 | 阿不      
这两天在看这Atlas脚本,还想总结一下,没想到这么早就你这文章了。headchen的论述也非常深刻,收藏起来!
  回复  引用  查看    
#31楼 [楼主] 2006-06-21 16:54 | Dflying Chen      
@阿不
恩,不过现在没空了……
  回复  引用  查看    
#32楼  2007-04-15 12:52 | mmn [未注册用户]
[url=http://***/31.htm]先进烧饭法[/url]
[url=http://***/32.htm]孙悟空合葬墓[/url]
[url=http://***/33.htm]拉客找假币[/url]
[url=http://***/34.htm]裸眼立体电视[/url]
[url=http://***/35.htm]拉客 假币[/url]
[url=http://***/36.htm]海归 假文凭[/url]
[url=http://***/37.htm]女子同丈夫和情夫[/url]
[url=http://***/38.htm]内地富太太俱乐部[/url]
[url=http://***/39.htm]想拥入怀的女性[/url]
[url=http://***/40.htm]日本的卫生间[/url]
[url=http://***/41.htm]女生周末夜生活纪实[/url]
[url=http://***/42.htm]巩俐 怀孕[/url]
[url=http://***/43.htm]海南人体艺术摄影第一人[/url]
[url=http://***/44.htm]走秀透明内衣[/url]
[url=http://***/45.htm]明星缤纷夜生活[/url]
[url=http://***/46.htm]内衣表情[/url]
[url=http://***/47.htm]中国空姐[/url]
[url=http://***/48.htm]私房写真[/url]
[url=http://***/49.htm]女明星清凉[/url]
[url=http://***/50.htm]珍贵雪獒[/url]
[url=http://***/51.htm]北京富豪俱乐部[/url]
[url=http://***/52.htm]妙龄小姐[/url]
[url=http://***/53.htm]爆强的中学生[/url]
[url=http://***/54.htm]偷看美女[/url]
[url=http://***/55.htm]日本旧时美女[/url]
[url=http://***/56.htm]中华轻功大揭秘[/url]
[url=http://***/57.htm]最消魂十大对手戏[/url]
[url=http://***/58.htm]号被盗之后怎么办[/url]
[url=http://***/59.htm]公元3000年后生活揭密[/url]
[url=http://***/60.htm]24小时生活细节[/url]
  回复  引用    
#33楼  2008-07-22 11:31 | 簡簡單單..      
Mark
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-05-09 11:53 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: