2007-11-03
用一般的oo思想'解读'javascript中的oo方法<未完成..>
关键字: javascript extjs 代码
- //类的定义就应该这样
- function myClass(name,value){
- //私有变量name,value
- //私有函数
- var myGetName = function(){return name};
- var mySetName = function(aName){name = aName};
- //操作私有成员的特权函数
- this.getName = function(){return myGetName()};
- this.setName = function(aName){mySetName(aName)};
- this.getValue = function(){return value};
- this.setValue = function(aValue){value = aValue};
- //类的公共属性
- this.openNum = '20053572';
- }
- //类的公共属性
- myClass.prototype.openScore = 100;
- //类的公共方法
- myClass.prototype.callName = function(){
- alert('my name is '+ this.getName());
- }
- //然后实例化一个对象
- var myObj = new myClass('xombat','1');
- myObj.callName();
- //类的继承
- mySubClass = function (name,value){
- //调用构造函数
- myClass.call(this,name,value);
- };
- //使用指定原型的方式继承
- mySubClass.prototype = new myClass();
- var superclass = mySubClass.prototype;
- superclass.constructor = mySubClass;
- //重定义父类的方法
- superclass.callName = function(){
- //var btn = Ext.get('btn');
- Ext.MessageBox.show({
- width:200,
- animEl:"btn",
- msg:'xombat == good',
- title:'oh ,king!'
- });
- }
- var mySubObj = new mySubClass('ixombat','2');
- Ext.onReady(mySubObj.callName,mySubObj);
下面以下面这个分析为例:
出自:http://extjs.com/learn/Tutorial:Application_Layout_for_Beginners_%28Chinese%29
我进行了一下修改,修改后为(改动地方用红色标出)
js 代码
- // 创建命名空间
- Ext.namespace('myNameSpace');
- // 创建一个类(而不是应用程序)
- myNameSpace.myClass = function() {
- // 元素还没创建,未能访问
- // 私有变量
- var btn1;
- var privVar1 = 11;
- // 私有函数
- var btn1Handler = function(button, event) {
- alert('privVar1=' + privVar1);
- alert('this.btn1Text=' + this.btn1Text);
- };
- // 公共空间
- return {
- // 公共的属性,如,要转译的字符串
- btn1Text: 'Button 1'
- // 公共方法
- , init: function() {
- btn1 = new Ext.Button('btn1-ct', {
- text: this.btn1Text
- , handler: btn1Handler
- });
- }
- };
- };//(); //程序底部
- //添加下面这行,用来实例一个对象
- myNameSpace.app = new myNameSpace.myClass();
这是Ext中给的一个面向对象的代码模板,return 上面的是私有变量和私有方法,return下面的是公共变量和公共函数。其中还引入一个特权的概念,在函数体中定义的公共函数(为特权函数)可以访问私有 变量/方法(即为特权函数的特点),而其它的公共函数不能访问私有变量/方法。
解读名字空间:
名字空间的概念其实也是一些object对象,比如我定义myNS.xmlNS:
js 代码
- Ext.namespace('myNS.xmlNS');
其实就是定义了一个myNS = new Object;(如果Ext中myNS还未定义的话)
然后myNS.xmlNS = new Object;
解读实例的对象:
app为被实例的对象,app其实也就是一个函数的返回值,返回的是个对象直接量。
解读public / private访问权限:
因此函数执行完之后,return返回的这些对象被app引用,所以没有被回收,因此被称为public的,并能从外部查看。
而return 之上的为private的,是因为function执行完之后,这些局部变量(其中未被public变量引用的)被释放掉了,无法再从外部读取。但是他们为return后的函数做了些计算准备,因此还是有用的,相当于私有变量/方法。
构造函数:
至于构造函数,一般oo语言的构造函数是用来生成对象的,而这整个function正好有这个效果。
不足:
但是js无法模仿oo的所有特性:oo的公共方法应该可以访问私有方法,但是一般情况下js中却不能直接用公共方法调用私有方法,因为构造函数已经执行完了,私有方法的引用已经被释放了。因此:
1.引入一个特权概念,存在于构造函数中的公共方法叫做特权函数,比如上面代码中的init函数,虽然构造函数运行完了,但他的btn1handler仍持有那个函数的引用,因此他可以调用内部的方法。而如果这样:
js 代码
- Ext.apply(myNameSpace.app, {
- btn1Text:'Taste 1'
- , init: function() {
- try {
- btn1 = new Ext.Button('btn1-ct', {
- text: this.btn1Text
- , handler: btn1Handler
- , scope: this
- });
- }
- catch(e) {
- alert('错误: "' + e.message + '" 发生在行: ' + e.lineNumber);
- }
- }
- });
,通过使用apply方法改变app类的init函数实现,却会出现错误。因为新的btn1Handler是一个新的对象里面的,他没有引用到原来的那个 btn1Handler(也无法引用到,因为构造函数已经运行完了,里面的btn1Handler已经释放了)。说明,一般情况下,公共方法无法调用私有 方法。
2.即使是特权函数,里面的btn1Handler仍然只是那个函数的引用,对于他引用的这个函数,使用的数据无法,....
发表评论
- 浏览: 59011 次
- 性别:

- 来自: 乌托邦

- 详细资料
搜索本博客
最近加入圈子
链接
最新评论
-
基于web的项目管理,还需 ...
我要说楼主你这一套很不实用不符合XP精神
-- by Joo -
基于web的项目管理,还需 ...
我能想到的就是:再加一个maven的reporsitory服务器(如果项目中要使 ...
-- by pipilu -
【团队管理】大家Have A ...
你分配任务的时候有询问过他们的意见吗? 你在总结的时候有说个人的优点吗? ...
-- by alanwu -
基于web的项目管理,还需 ...
svn,ftp需要服务器,自己架的话还需要维护,麻烦 trac呢无法集成到我们的 ...
-- by xombat -
基于web的项目管理,还需 ...
汗你的团员会用你的工具工作么?怎么看也是手动svn,ftp,白板,纸条方便 一些 ...
-- by 抛出异常的爱






评论排行榜