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');
相关推荐
从描述中我们了解到,JavaScript做面向对象开发时,通常需要模拟面向对象的特性,比如私有成员、继承、多态等。这些模拟的代码构成了JavaScript面向对象开发的核心。 接下来,我们将通过分析提供的核心代码片段来...
除了面向对象编程之外,确保代码的质量也是开发高质量JavaScript应用的关键。为了达到这一目的,建立一个强大的测试环境变得尤为重要。对于那些需要频繁使用或将来可能由其他人维护的代码来说,这一点尤为重要。 **...
面向对象编程语言则通过对象的封装、继承和多态来模拟现实世界。 2. 面向对象编程的建模局限性:面向对象编程虽然提供了一种有效的建模范式,但随着业务复杂性的增加,传统的面向对象结构和树状抽象开始显现出局限...
5. **面向对象编程**:讨论JavaScript的面向对象特性,如类的模拟、继承、多态等。 6. **正则表达式**:详细解释正则表达式的语法和用法,用于文本处理和模式匹配。 7. **错误处理**:如何使用try...catch进行错误...
- **面向对象基础**:JavaScript中的对象概念与使用。 - **屏幕和浏览器对象**:了解浏览器对象模型(BOM)。 - **文档对象**:DOM的核心概念与操作方法。 - **历史对象和地址对象**:掌握浏览器的历史对象和位置对象...
- **ActiveRecord:Rails的模型支持**:ActiveRecord是一种对象关系映射(ORM)技术,它允许开发者以面向对象的方式操作数据库,而无需编写复杂的SQL语句。 - **ActionPack:视图与控制器**:ActionPack是一个包含...
深入理解面向对象编程(OOP)概念,如封装、继承和多态,是Java的核心。此外,熟悉异常处理、集合框架(如ArrayList、LinkedList、HashMap等)以及IO流操作也是必备技能。 对于“GIS瘦客户端开发”,这指的是使用...
VB是微软开发的一种面向对象的编程语言,它简化了事件驱动编程模型,使得编写GUI(图形用户界面)应用程序变得容易。VB源代码清晰易读,适合初学者学习编程。在这个项目中,VB被用来实现浏览器的核心功能,如解析...
编程语言的发展历程可以追溯到计算机的早期阶段,从低级语言到高级语言,再到面向对象的语言,每一步都标志着编程语言的进步和效率的提升。早期的计算机语言,如机器语言和汇编语言,是由二进制代码0和1组成,极其...
当我们谈论`prototype1.4`时,我们可能是指JavaScript库Prototype 1.4版本,这是一个历史悠久的库,旨在扩展JavaScript的功能,提供更强大的面向对象编程能力。 Prototype 1.4主要关注以下知识点: 1. **对象扩展*...
面向对象编程是Java的核心,课程会深入探讨封装、继承、多态和接口的应用,以及JVM性能优化。 接下来,课程涉及JDK的核心API,包括常用工具包、异常处理、集合框架和反射机制。I/O流部分讲解IO性能分析,字节和字符...
六十年代末期,软件危机催生了面向对象程序设计(OOP)的出现。OOP强调通过封装、继承和多态性来组织代码,以模拟现实世界中的对象和它们之间的交互。Eiffel、C++和Java等语言的诞生,极大地推动了这一概念的发展,...
- **面向对象编程**:作为一种自然演进的结果,面向对象编程(OOP)提供了一种新的方法来组织和管理代码。它强调通过封装、继承和多态等机制来创建对象和类,从而更好地模拟现实世界中的实体及其行为。面向对象编程...
80年代,面向对象编程(OOP)的理念兴起,C++和Objective-C等语言引入了类和继承等概念,使代码能够更好地模拟现实世界中的实体和关系。Smalltalk和Eiffel也是这一时期的代表。 90年代,Java的诞生进一步推动了OOP...
虽然Unity3D默认使用C#作为主要的编程语言,但Java作为一种强大的面向对象编程语言,在某些场景下也可以与Unity结合使用,尤其是在资源管理和跨平台兼容性方面展现出独特的优势。 - **Java语言特点**:Java具有平台...
- **背景知识**:包括面向对象编程、集合、图形用户界面、多线程、文件处理以及网络编程等内容,这些是学习Servlet的基础。 #### 二、Java Web开发基础知识 - **数据库编程**:介绍如何使用JDBC进行数据库操作,...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而著名。在本资源中,"基于java的约瑟夫环演示Applet源码.zip" 提供了一个用Java实现的经典算法——约瑟夫环(Josephus Problem)的示例。...