`

Javascript静态类数组与框架基本实现

阅读更多
Javascript静态类数组与框架基本实现

这篇文章是我一直想写的。没有什么技术含量,只是与大家分享一下自己在开发过程中的一些小技巧吧。

先来讲讲静态类数组(类数组):
       JavaScript是一个弱类型的语言,但是我们可以通过不同的方式来侧面的实现类的创建,不管是工厂函数、函数原型还是静态类,均可实现模拟类,每一种都有它的特点。
       静态类数组即是建立在静态类的基础上实现的数组模型。
       var class = {
              name : "object",
              color : "red"
          }
以上是创建了一个静态类class,我们知道,调用类的成员有两种方式
点号形式:class.name
索引形式:class["name"]
其中索引形式与数组的形式非常相像,我们不妨设计一个如下样式的静态类:
        var LikeArray = {
                0 : "A",
                1 : "B",
                2 : "C"   
          }
如果现在我用索引的形式来调用类的成员属性0,1,2,即LikeArray[0]、LikeArray[1],这样便与数组对象十分相似,唯一的区别就是没有length属性(我们可以通过添加length成员来模拟length属性)。
注:只有静态类的成员名才能以纯数字来命名,调用成员若为纯数字命名则可以省略双引号。

我们先把上面讲的放一放,来看一个别的函数——apply:
apply是一个特殊又十分有用的东西,它的作用是可以改变当前作用对象的方法内this指针指向另一个对象。
语法为:[对象.]方法.apply(另一个对象[,参数数组]);
如:
var one = function(){
        this.arr = ["a","b","c"];
        this.show = function(){
          alert(this.arr);
        }
      }
var two = function(){
        this.arr = ["d","e","f"];
      }
     var obj = new one();
     obj.show.apply(new two());  //使用one对象的show方法但其内部this却指向了two对象,因此会弹出d,e,f
以上也可以说明,apply使two对象继承了one对象的成员属性或方法并立即使用。

下面,我们结合静态类和apply动态生成静态类数组:

var obj = {
   length : 0      //①
}
var arr  = ["a","b","c","d","e"];  //定义数组并初始化
[].push.apply(obj,arr);   // ②
alert(obj[1]);  //Debug,弹出b

①这里仿照数组,模拟设置了一个length属性(必须,后面介绍)
② []表示数组对象,等同于new Array(),通过apply使obj类继承Array类的push方法并使用,同时给push方法传入参数arr。整体效果即为,将数组arr强行压入obj类,使它成为类似于如下的形式:
var obj = {
   length : 0,
   0 : "a",
   1:  "b",
   2:  "c",
……
}
注:由于push方法有一个关联属性——length,push每一个数组元素,length都会自动加一,因此length不可缺少,我们为静态类obj特意加上length属性,这样[].push.apply(obj,arr);才能正常运行。

这样,整个静态类数组(类数组)简单的实现就完成了,用处不是很多,基本是用在Javascript框架(库)中去,其中jQuery库也牵扯到此内容。下面,我们就制作一个简单Js框架(类似于Jquery),功能虽简单,只要大家勤动手动脑,为这个小小的框架扩展,就可以完成一个属于自己的js库。

/* Your JavaScript Framework */
var fw = $ = window.$ = window.fw  = function(selector){
            return new fw.fn.init(selector);    //fw对象以静态类数组形式存在,生成的实际是init的实例
   }
fw.fn = {  //新的命名空间名fw.fn
     setArray : function(arr){  //生成fw对象的类数组
       this.length = 0;  // 模拟length属性初始化
       [].push.apply( this, arr ); // 继承数组对象push方法
  },
     init : function(selector){
         var d=[];   //定义一个临时的DOM数组,用来存储DOM对象
         if(selector.indexOf("#")== 0){    //获取一个ID元素
         d[0]=document.getElementById(selector.substr(1)); // 唯一性的ID元素赋予d[0]即可
          }
         else if(selector.indexOf(".")== 0){    //获取指定Class元素集合
         var j=0;
          var A = document.getElementsByTagName('*'); // 以下均为获取class算法
                  for (var i=0; i< A.length; i++ ) {
                     if (A.className == selector.substr(1) ) {
                         d[j++] = A;
                    }
                  }
        }
          else{   //获取标签元素集合
           d=document.getElementsByTagName(selector);  // 标签是一个集合,因此可以直接赋予临时数组d保存
          }
   var arr = []; // 定义空数组
   for(var i=0; i<d .length; i++){  //遍历临时数组d
     arr.push(d);  //将d中的DOM元素依次压入数组arr中
   }
    d = null;  //释放临时DOM数组
    return this.setArray(arr);  // 返回类数组对象
  },
html : function(value){
     if(typeof(value)=="undefined"){  //如果参数为空,则说明是读取内容
            return this[0].innerHTML;   // this[0]的目的是将fw对象转换成DOM对象,以便使用innerHTML方法
     }
     else{
            this[0].innerHTML=value; //关于对象转换将在以后的文章中介绍,如果这篇原理了解了相信大家会自己明白
     }
      return this;  //返回fw对象,可以实现连写
  }
}
fw.fn.init.prototype = fw.fn;   // 将fw.fn内的所有成员复制给init,这样new出来的init对象才能使用自己框架的方法

现在我们开始调试:
<div id="a">Hello </div>
<p class="b"> My </p>
<span> Framework<span>

<script language="javascript">
var s = $("#a").html() + $(".b").html() + $("span").html(); // fw框架选择器,调用我们的html方法
alert(s);
$("#a").html("Welcome ");  // 有参数的html方法可以修改内容
</script>

好啦,今天就讲这么多,有兴趣的朋友可以对这个框架进行方法扩展。
分享到:
评论
1 楼 renjie120 2011-01-15  
呵呵,看到了,不错啊,基本的jquery的代码是不是和这里类似了,应该是借鉴了jquery的源码吧.

相关推荐

    纯JavaScript静态树型

    根据所提供的代码片段及描述,本文将深入探讨“纯JavaScript静态树型”(即不依赖任何框架或库,只用原生JavaScript实现的树形结构)的具体实现方式。 #### 二、关键概念与术语解释 1. **树形结构(Tree Structure)...

    JavaScript_HTML表示框架.zip

    JavaScript是一种广泛应用于网页和网络应用的编程语言,尤其在实现客户端的交互性和动态功能方面扮演着核心角色。HTML,即超文本标记语言,是构建网页结构的基础,而JavaScript则为这些静态页面注入了生命力,使其...

    PrototypeJavaScript框架

    Prototype通过扩展JavaScript的原型链来实现类和对象的继承。它提供了一个`Class.create()`方法,用于创建新的类,并且支持多重继承,通过`Object.extend()`可以合并对象属性。 2. **DOM操作**: Prototype提供了...

    javaScript网页设计特效

    1. 变量与数据类型:JavaScript支持var、let和const声明变量,有基本数据类型(如字符串、数字、布尔)和引用数据类型(对象、数组)。 2. 控制结构:包括条件语句(if...else)、循环(for、while、do...while)和...

    JavaScript开发技术大全

    10. **TypeScript和Babel**:TypeScript是JavaScript的超集,提供了静态类型检查,而Babel则是一个编译器,可以把ES6+的高级语法转换为向后兼容的JavaScript代码,使得新特性能在旧浏览器中运行。 此外,书中可能还...

    Javascript参考资料

    11. **框架与库**:JavaScript有许多流行框架和库,如React.js、Vue.js、Angular.js用于前端开发,Node.js用于后端开发,jQuery简化DOM操作,Lodash提供实用工具函数等。 12. **ES新特性**:ECMAScript(ES)是...

    JavaScript语言精髓与编程实践完整版

    14. **React/Angular/Vue**:三大前端框架的使用和原理,以及如何与JavaScript结合构建大型Web应用。 15. **测试与调试**:单元测试、集成测试的实践,以及如何使用开发者工具进行代码调试。 这本书不仅会覆盖这些...

    多种javascript实现的分页样式

    综上所述,"多种JavaScript实现的分页样式"涵盖了从基础的JavaScript实现到高级的前端框架应用,包括CSS美化、插件选择、组件开发、动态加载等多个方面。通过理解并掌握这些技术,开发者可以创造出既美观又实用的...

    边用边学JavaScript

    10. **JavaScript框架与库**:如React、Vue、Angular等,它们提供了高级抽象,简化了前端开发,同时引入了组件化、虚拟DOM等概念。 通过"边用边学JavaScript"这个教程,你可以逐步了解和实践这些概念,通过实例深入...

    JavaScript_javascript_

    它主要用于实现客户端的交互性和动态效果,赋予静态网页生机与活力。 在JavaScript中,基础知识包括以下几个关键点: 1. **变量(Variables)**:JavaScript中的变量用于存储数据,可以随时改变其值。声明变量使用...

    javascript

    JavaScript的核心概念包括变量、数据类型、运算符、控制结构、函数、数组、对象和类。变量在JavaScript中是动态类型的,意味着它们可以存储不同类型的数据,如字符串、数字、布尔值等。数据类型有基本类型(如null、...

    JavaScript实例自学手册:通过486个例子掌握.net开发捷径

    JavaScript是Web开发中不可或缺的一部分,尤其在与.NET框架结合时,可以实现强大的前端交互和后端数据处理。这本书“JavaScript实例自学手册:通过486个例子掌握.NET开发捷径”旨在帮助读者深入理解JavaScript语言,...

    JavaScript学习指南 源代码

    十、框架与库 JavaScript有许多流行框架和库,如React、Vue、Angular等,它们简化了开发过程,提高了开发效率。学习JavaScript的同时,了解并掌握这些工具的使用也是必要的。 以上是“JavaScript学习指南”源代码所...

    《突破JavaScript编程实例五十讲》源文件

    JavaScript是一种广泛使用的客户端脚本语言,它在网页开发中扮演着至关重要的角色,使得网页不仅限于静态展示,而是能够实现丰富的用户交互。 本书的核心在于通过实例来教授JavaScript编程技巧,帮助读者理解和掌握...

    JavaScript_Web开发者的HTML、CSS和Javascript示例代码.zip

    - 类(ES6+):`class` 关键字实现面向对象编程 - 解构赋值:方便地从数组或对象中提取值 - 扩展运算符:`...` 用于复制数组或合并对象 - 遍历器(Iterator)和生成器(Generator) - 布尔短路和逻辑运算符:`&...

    JavaScript使用

    JavaScript是一种广泛应用于网页和网络应用的脚本语言,由Netscape公司的Brendan Eich在1995年发明,起初命名为LiveScript,后来为了与Sun Microsystems的Java语言搭上关系,更名为JavaScript。尽管名字相似,但...

    javaScript使用详解.pdf

    七、JavaScript框架与库 1. jQuery:简化DOM操作、事件处理和Ajax请求的JavaScript库。 2. React:Facebook推出的用于构建用户界面的库,采用虚拟DOM和组件化思想。 3. Vue.js:轻量级的前端框架,提供数据绑定、...

    JavaScript快速查询手册

    11. **框架与库**:JavaScript社区发展迅速,有许多流行框架和库如React、Vue、Angular用于构建复杂Web应用,jQuery简化DOM操作,Lodash提供实用工具函数。 12. **性能优化**:JavaScript性能优化包括减少DOM操作、...

    JavaScript 教程(CHM格式).rar

    JavaScript是一种广泛应用于网络开发的脚本语言,由Netscape公司的Brendan Eich在...通过阅读和实践教程中的内容,你可以全面掌握JavaScript编程技能,从而在网页开发、前端框架应用、Node.js后端开发等领域游刃有余。

Global site tag (gtag.js) - Google Analytics