`

继承体系 --class.js

    博客分类:
  • RIA
 
阅读更多

//继承
 //实现singlaton
 //可以调用基类函数
 //JavaScript通过构造函数和原型的方式模拟实现了类的功能。
  
 
  var Class = (function(){
 
     //IE不会遍历几个特殊属性:"constructor", "toString", "valueOf"
      var IS_DONTENUM_BUGGY = void function(){
         for (var p in { toString: 1}) return false;
         return true;
     }(); 
     function create(options){
         var options = options || {}, uniqueInstance = null;
         //判定是否需要实现单例
          var singleton = !!options.singleton;
         delete options.singleton;
         //父类
         var superclass = options.inherit || {};
         delete options.inherit;
         
         function klass(){
             if (!singleton)  this.init.apply(this, arguments);
         }
         //添加类方法
         $U.extend(klass, Class.Methods);
         //是否继承
         if ($U.isFunction(superclass)) {
             var bridge = function(){};
             bridge.prototype = superclass.prototype;
             klass.prototype = new bridge;
             klass.superclass = superclass;
         }
         //添加原型方法
         klass.addMethods(options);
         
         if (!klass.prototype.init) 
             klass.prototype.init = function(){
             };
         //修正constructor    
         klass.prototype.constructor = klass;
         //__proto__是什么?我们在这里简单地说下。每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性时,如果
         //这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样
         //一直找下去,也就是我们平时所说的原型链的概念。
         //按照标准,__proto__是不对外公开的,也就是说是个私有属性,但是Firefox的引擎将他暴露了出来成为了一个共有的属性,
         //我们可以对外访问和设置。
         
         //修复IE与Opera中的第二条原型链
         if (!klass.prototype.__proto__) klass.prototype.__proto__ = klass.prototype;
         
         
         //处理函数:如果singleton模式,则private constructor
         return singleton ? {
             getInstance: function(){
                 if (!uniqueInstance) {// Instantiate only if the instance doesn't exist.
                     uniqueInstance = new klass;
                     uniqueInstance.init.apply(uniqueInstance, arguments);
                 }
                 return uniqueInstance;
             }
         } : klass;
     }
     function addMethods(source){
         var ancestor = this.superclass && this.superclass.prototype, properties = $U.keys(source);
         //处理IE不能遍历的特殊属性。
         if (IS_DONTENUM_BUGGY) {
             if (source.toString != Object.prototype.toString) 
                 properties.push("toString");
             if (source.valueOf != Object.prototype.valueOf) 
                 properties.push("valueOf");
         }
         for (var i = 0, length = properties.length; i < length; i++) {
             var property = properties[i], value = source[property];
             //在C#中,如果子类有意隐藏基类成员,使用关键字"new"
             //使用base关键字显示调用基类构造函数
             //这这里约定如果子类方法第一个参数是“$super”,则调用父类的方法.
             if (ancestor && $U.isFunction(value) && (value.argumentNames()[0] === "$super")) {
                 var method = value;
                 //var f = (function(m){ return function(){ return ancestor[m].apply(this, arguments)}})(property)
                 //f.wrap(method)
                 
                 //F.prototype[name] = (function(name, fn) {
                 //    return function() {
                 //        var that = this;
                 //        $super = function() {
                 //            return baseClass.prototype[name].apply(that, arguments);
                 //        };
                 //        return fn.apply(this, Array.prototype.concat.apply($super, arguments));
                 //    };
                 //})(name, prop[name]);
                 
                 
                 //总之,实现把基类函数作为子函数的第一个参数,以此调用父函数。
                 value = ancestor[property].wrap(method);
                 value.valueOf = method.valueOf.bind(method);
                 // 因为我们改变了函数体,所以重新定义函数的toString方法
                 // 这样用户调用函数的toString方法时,返回的是原始的函数定义体
                 value.toString = method.toString.bind(method);
             }
             this.prototype[property] = value;
         }
         return this;
     }
     return {
         create: create,
         Methods: {
             addMethods: addMethods
         }
     };
 })()
 
 
 //继承
 //实现singlaton
 
 var F = function(){
 };
 F.prototype.getInstance = function(){
 
     var instance = null;
     
     return function(){
         if (!instance) 
             instance = new this;
         return instance;
     };
     
 }();
 
分享到:
评论

相关推荐

    Struts2jar包

    Struts2的核心功能包括动作调度、请求处理、结果渲染、验证逻辑以及插件体系等,极大地简化了开发者的工作。 在描述中的"Struts2安装配置包",通常包含了运行Struts2应用所需的JAR文件,这些文件主要分为以下几类:...

    10步走进JavaScript

    ### 《10步走进JavaScript...通过以上十个步骤的学习,《10步走进JavaScript》不仅能够帮助读者建立起坚实的JavaScript基础知识体系,还能够培养良好的编程习惯和技术素养,为成为一名优秀的前端开发者打下坚实的基础。

    Javascript 总结

    JavaScript,又被称为JS,是一种广泛应用于网页和网络应用的脚本语言,主要在客户端运行,为用户提供动态交互体验。作为互联网的重要组成部分,JavaScript是前端开发的基石,它能够操作HTML、CSS、处理用户输入、与...

    JavaScript es6-xmind.zip

    5. **类(Class)和继承**:ES6引入了类的概念,虽然其底层仍然是基于原型的,但语法上更接近面向对象的语言,简化了构造函数和原型链的使用。同时,通过`extends`关键字实现继承,`super`关键字用于调用父类的方法...

    摘《谈谈scriptaculous动画效果库effect.js(原理和使用)》

    effect.js的源码清晰地展示了其内部结构和机制,包括动画效果的继承体系、变化函数的实现以及事件处理。通过阅读源码,开发者可以更深入地理解其工作原理,以便进行更高级的定制和优化。 总之,scriptaculous的...

    深入浅析javascript继承体系

    JavaScript是一种基于原型(prototype)的继承体系,与其他基于类(class)的语言如Java或C++的继承体系有所不同。在JavaScript中,继承是通过原型链实现的,原型链是对象属性和方法查找的路径。 首先,需要明确几...

    pixitemplate:pixi.js 的简单包装器,包括 requirejs、js.class 和质子粒子引擎

    js.class库是JavaScript中的一个面向对象编程工具,它模仿了Java和C++的类体系结构,提供了类、继承、构造函数等概念。使用js.class可以更容易地创建和管理对象,实现更加复杂的逻辑和设计模式。 Proton粒子引擎是...

    javascript 权威指南

    这本书详细深入地探讨了JavaScript的各个方面,为开发者提供了全面且权威的知识体系。 1. **变量、数据类型与作用域** - JavaScript中的变量可以动态声明,并使用`var`、`let`和`const`关键字。 - 数据类型包括...

    javaScript知识大全

    JavaScript,又被称为JS,是一种广泛应用于网页和网络应用的脚本语言,主要在客户端运行,为用户提供动态交互体验。作为互联网技术的重要组成部分,JavaScript的知识体系庞大且深入,涵盖了许多方面。以下将根据提供...

    前端XMind汇总

    本"前端XMind汇总"是一个集大成的知识体系,包含了大量的个人实践和总结,涉及JavaScript、Node.js、Vue.js以及React.js等多个关键领域的核心概念和技术。以下是这些关键知识点的详细阐述: 1. JavaScript(JS): ...

    java中abstractclass和Interface.doc

    这意味着抽象类在继承体系中扮演着严格的父类角色,限制了类的多继承性。 - 抽象类提供了代码复用的机会,当多个子类有共同的属性或行为时,可以将这些共享的代码放入抽象类中。 2. 接口: - 接口只包含抽象方法...

    B

    以上只是JavaScript知识体系的一部分,实际上,JavaScript还有许多高级特性,如Proxy、Reflect、Generator、WebAssembly等,不断推动着前端技术的发展。通过深入学习和实践,开发者可以利用JavaScript构建复杂的Web...

    java-打印.docx

    * 声明形式:[public] [abstract | final] class 类名称 [extends 父类名称] [implements 接口名称列表]{ 变量成员声明及初始化; 方法声明及方法体;} * 修饰符: + public:说明此类为公有类 + abstract:指明...

    出现几率最高和覆盖范围最广的一套经典Java面试题.docx

    Java语言是软件开发领域广泛使用的编程...以上内容涵盖了Java基础、集合、多线程、异常处理、J2EE框架、XML解析等多个方面,是Java开发者必备的知识体系。通过深入理解和实践,可以提升Java编程能力并为面试做好准备。

    java学习笔记

    - 数据库体系结构:表空间、段、区、块。 - SQL语句:查询(SELECT)、插入(INSERT)、更新(UPDATE)、删除(DELETE)。 - PL/SQL:过程式语言扩展,支持过程化逻辑处理。 2. **JDBC**: - JDBC驱动:加载、注册、...

    供参考学习的js体系文档

    本压缩包包含的"供参考学习的js体系文档"是一份全面介绍JavaScript基础知识、进阶技术和实践应用的资料集合,旨在帮助学习者构建坚实的JS知识体系。 文档可能涵盖了以下关键知识点: 1. **基础语法**:包括变量...

    帕古卡达

    这些只是JavaScript庞大知识体系的一部分。通过深入学习和实践,开发者可以利用JavaScript实现丰富的网页功能和复杂的应用程序。如果你的"帕古卡达"项目涉及到JavaScript的具体应用,比如Web开发、Node.js服务端开发...

    计算机二级常考的知识点.pdf

    - **体系结构**:ISO/OSI七层模型或TCP/IP四层模型。 - **TCP/IP协议族**:包括传输控制协议(TCP)、互联网协议(IP)、用户数据报协议(UDP)等。 - **局域网(LAN)**:如以太网,通常在一个小区域内连接计算机。 - *...

Global site tag (gtag.js) - Google Analytics