`
openxtiger
  • 浏览: 151167 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[Js++开发历程] 模拟面向对象

    博客分类:
  • Js++
 
阅读更多

1.2 模拟面向对象

要说到面向对象,Java的语法规范应该会比较熟悉,C#也同样。

谈到面向对象就得做到封装,对于Javascript如何做封装才最有效呢?不禁让我联想到闭包

1.2.1 闭包

  闭包是能够读取其他函数内部变量的函数。

1.2.2 链式作用域

  JavaScript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。

所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

 

综合以上两点,Js++ 的面向对象都在函数体内实现“成员变量”和“成员函数”。

1.2.3 现在疑问就是这些“成员变量”和“成员函数”如何能开放出来,使得外界可以访问呢?其实有普遍有两种方法:

A. 将“成员变量”和“成员函数”做json成员,然后通过 return 关键字 从函数返回。

var D = function(){
 
return { //然后通过 return 关键字 从函数返回。
  v:1,
  fun:function(){
 
  }
};
 
};
 
var Class = D();

 

 

B. 通过传出一个对象,将“成员变量”和“成员函数”扩展到此对象中

 

var D = function($){
 
 $.extend($,{  // “成员变量”和“成员函数”扩展到此对象$
   a:1,
   fun:function(){
 
   }
 });
};
 
var Class = {};
D(Class);

 

 

C. 其实有一种更加巧妙的方法是通过 Function.caller

Function.caller

  返回一个对函数的引用,该函数调用了当前函数。

  有了此caller,我们就可以“成员变量”和“成员函数”存入到外围的函数上

 

function jpublic(overrides) {
    $.extend(jpublic.caller.$Public, overrides);
}
function jprotected(overrides) {
    $.extend(jprotected.caller.$Public, overrides);
}
 
var D = function(){  // 外围的函数
 
  jpublic({  // “成员变量”和“成员函数” 会存入外围的函数的$Public变量上
    a:1,
    fun:function(){
 
    }
  });
 
  jprotected({
    b:2
  });
 
};
 
var Class = D().$Public;
 

 

此时,就可以定义类似public,protected,private等关键字来区分类“成员变量”和“成员函数”不同作用域

 

 

1.2.4 关于继承的模拟

  可以采用原型链的方式

 

1.2.5 对父类成员的“成员函数”的访问

    由于在继承的模拟原型链中,已将子类和父类prototype通过superclass关联,因此可以这样访问:

'class A'.j(function(){
  jpublic({
    fun:function(){
 
    }
  });
 
});
 
'class B extends A'.j(function(){
  jpublic({
    fun:function(){
      B.superclass.fun.apply(this,arguments);  //通过superclass关联访问父类成员的“成员函数” fun
      // 可用 jsuper(this); 替换 B.superclass.fun.apply(this,arguments);
    }
  });
 
});

 

B.superclass.fun.apply(this,arguments); 这个写太长,而且麻烦,有没有更好的呢,经过多次的实践,终于又回到了Function.caller

 

function jsuper(jthis) {
    var m = jsuper.caller;  // 获得当前调用者,以上的例子为"fun" 函数
    if (m.methodname && m.owner) { // 在类定义时,已将每个“成员函数”的函数名和所属的类的构造函数存入到每个“成员函数”中
        var method = m.methodname;
        var owner = m.owner;
        var args;
        if (arguments.length > 1) { // 如果 jsuper 有传入参数,则采用传入参数,否则采用 fun 的 arguments
            args = $.toArray(arguments, 1);
        } else {
            args = $.toArray(m.arguments);
        }
        return owner.superclass[method || 'constructor'].apply(jthis, args); //访问父类成员的“成员函数” fun
    }
    return null;
}
 

 

1.2.6 在“成员函数”中使用“静态变量”

  Js++ 将静态变量存在类的构造函数中,可通过 jstatic.caller.owner获取构造函数

function jstatic(overrides) {
    if (arguments.length == 0) {
        return jstatic.caller && jstatic.caller.owner;
          //在类定义时,已将每个“成员函数”的函数名和所属的类的构造函数存入到每个“成员函数”中
    }
    return $.extend(jstatic.caller.$Static, overrides);
}

 

 

 

1.2.7 完整例子:

 

'class C extends P implements I'.j(function(csuper){
 
     jstatic({
         a:1
     });
 
     jpublic({
         constructor: function () {
             jsuper(this);
         },
         echo:function(){
             console.log(jstatic().a);
         }
     });
 
     jprotected({
 
     });
 
     jprivate({
 
     });
 
},'alias class name');

 

 

1
1
分享到:
评论
1 楼 mfkvfn 2014-01-02  
JS++,我还以为又出新语言了呢

相关推荐

    面向对象Javascript核心支持代码分享

    从描述中我们了解到,JavaScript做面向对象开发时,通常需要模拟面向对象的特性,比如私有成员、继承、多态等。这些模拟的代码构成了JavaScript面向对象开发的核心。 接下来,我们将通过分析提供的核心代码片段来...

    Pro JavaScript-Tech中文版

    除了面向对象编程之外,确保代码的质量也是开发高质量JavaScript应用的关键。为了达到这一目的,建立一个强大的测试环境变得尤为重要。对于那些需要频繁使用或将来可能由其他人维护的代码来说,这一点尤为重要。 **...

    面向语言编程介绍

    面向对象编程语言则通过对象的封装、继承和多态来模拟现实世界。 2. 面向对象编程的建模局限性:面向对象编程虽然提供了一种有效的建模范式,但随着业务复杂性的增加,传统的面向对象结构和树状抽象开始显现出局限...

    JavaScript 2.0 The Complete Reference, Second Edition

    5. **面向对象编程**:讨论JavaScript的面向对象特性,如类的模拟、继承、多态等。 6. **正则表达式**:详细解释正则表达式的语法和用法,用于文本处理和模式匹配。 7. **错误处理**:如何使用try...catch进行错误...

    WEB前端开发课程计划

    - **面向对象基础**:JavaScript中的对象概念与使用。 - **屏幕和浏览器对象**:了解浏览器对象模型(BOM)。 - **文档对象**:DOM的核心概念与操作方法。 - **历史对象和地址对象**:掌握浏览器的历史对象和位置对象...

    Web开发敏捷之道第三版(中文版).pdf

    - **ActiveRecord:Rails的模型支持**:ActiveRecord是一种对象关系映射(ORM)技术,它允许开发者以面向对象的方式操作数据库,而无需编写复杂的SQL语句。 - **ActionPack:视图与控制器**:ActionPack是一个包含...

    java学习资料

    深入理解面向对象编程(OOP)概念,如封装、继承和多态,是Java的核心。此外,熟悉异常处理、集合框架(如ArrayList、LinkedList、HashMap等)以及IO流操作也是必备技能。 对于“GIS瘦客户端开发”,这指的是使用...

    IE浏览器(可执行文件+VB源码)

    VB是微软开发的一种面向对象的编程语言,它简化了事件驱动编程模型,使得编写GUI(图形用户界面)应用程序变得容易。VB源代码清晰易读,适合初学者学习编程。在这个项目中,VB被用来实现浏览器的核心功能,如解析...

    计算机编程语言的发展趋势.ppt

    编程语言的发展历程可以追溯到计算机的早期阶段,从低级语言到高级语言,再到面向对象的语言,每一步都标志着编程语言的进步和效率的提升。早期的计算机语言,如机器语言和汇编语言,是由二进制代码0和1组成,极其...

    prototype学习

    当我们谈论`prototype1.4`时,我们可能是指JavaScript库Prototype 1.4版本,这是一个历史悠久的库,旨在扩展JavaScript的功能,提供更强大的面向对象编程能力。 Prototype 1.4主要关注以下知识点: 1. **对象扩展*...

    Java课程学习分享经典认证班腾科.doc

    面向对象编程是Java的核心,课程会深入探讨封装、继承、多态和接口的应用,以及JVM性能优化。 接下来,课程涉及JDK的核心API,包括常用工具包、异常处理、集合框架和反射机制。I/O流部分讲解IO性能分析,字节和字符...

    计算机程序设计语言的发展史及现状资料.pdf

    六十年代末期,软件危机催生了面向对象程序设计(OOP)的出现。OOP强调通过封装、继承和多态性来组织代码,以模拟现实世界中的对象和它们之间的交互。Eiffel、C++和Java等语言的诞生,极大地推动了这一概念的发展,...

    主要程序设计语言范型综论与概要

    - **面向对象编程**:作为一种自然演进的结果,面向对象编程(OOP)提供了一种新的方法来组织和管理代码。它强调通过封装、继承和多态等机制来创建对象和类,从而更好地模拟现实世界中的实体及其行为。面向对象编程...

    计算机程序设计语言发展史和对程序设计语言未来的看法.pdf

    80年代,面向对象编程(OOP)的理念兴起,C++和Objective-C等语言引入了类和继承等概念,使代码能够更好地模拟现实世界中的实体和关系。Smalltalk和Eiffel也是这一时期的代表。 90年代,Java的诞生进一步推动了OOP...

    通过实例学习unity3d

    虽然Unity3D默认使用C#作为主要的编程语言,但Java作为一种强大的面向对象编程语言,在某些场景下也可以与Unity结合使用,尤其是在资源管理和跨平台兼容性方面展现出独特的优势。 - **Java语言特点**:Java具有平台...

    韩顺平servlet笔记

    - **背景知识**:包括面向对象编程、集合、图形用户界面、多线程、文件处理以及网络编程等内容,这些是学习Servlet的基础。 #### 二、Java Web开发基础知识 - **数据库编程**:介绍如何使用JDBC进行数据库操作,...

    基于java的约瑟夫环演示Applet源码.zip

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而著名。在本资源中,"基于java的约瑟夫环演示Applet源码.zip" 提供了一个用Java实现的经典算法——约瑟夫环(Josephus Problem)的示例。...

Global site tag (gtag.js) - Google Analytics