`
hrtc
  • 浏览: 54622 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ajax学习笔记一:面向对象的javascript

阅读更多
看了《征服Ajax - Web20开发技术详解试读版》第六章 发现写得很好,总结如下,很多是原书中的也增加了自己理解的部分
1.创建数组快捷方式
例子:
<script language="JavaScript" type="text/javascript">
<!--
var arr1 = new Array(1,2);//方式一
var arr2 = [1,2];//方式二
alert(arr1);
alert(arr2);
-->
</script>

以上两种创建数组的效果相同


2.使用方括号([])引用对象的属性和方法
语法:
方式一:对象名.属性(方法)名
方式二:对象名["属性(方法)名"]
区别:方式二可以有特殊字符
例子:
<script language="JavaScript" type="text/javascript">
<!--
Array arr=new Array();
//为数组添加一个元素
arr["push"]("abc");
//获得数组的长度
var len=arr["length"];//相当于arr.length
//输出数组的长度
alert(len);
-->
</script>



3.使用大括号({})语法创建无类型对象(注意:是对象不是类)
语法:
{
  property1:statement,
  property2:statement2,
  …,
  propertyN:statmentN
}
例子1:
<script language="JavaScript" type="text/javascript">
<!--
var obj = {
    a:"11111",
    print:function(){
        alert(this.a);
    }
};
obj.print();
-->
</script>

相当于
<script language="JavaScript" type="text/javascript">
<!--
function Class1(){
    this.a = "1111";
    this.print = function(){
        alert(this.a);
    };
}
var obj = new Class1();
obj.print();
-->
</script>

但上面的对象相关的类是匿名的
例子2:
<script language="JavaScript" type="text/javascript">
<!--
var objstyle = {
    text-align:center,
    background-color:#00CC00
}//是不是有点像css
-->
</script>



4.js对象成员的4种定义方式,搞清楚这点对写js的面向对象很有帮助
以下以定义方法为例,变量或对象类似
<script language="JavaScript" type="text/javascript">
<!--
function Class1(){
    //该类实例的私有方法,不能被外部访问
    method = function(){
        alert("private instance method");
    }
   
    //该类实例的公共方法
    this.method = function(){
        alert("public instance method");
        //调用私有方法
        method();
    }
}
//静态方法
Class1.method = function(){
        alert("static method");
}

//原型方法
Class1.prototype.method = function(){
    alert("prototype method");
}

var obj = new Class1();
obj.method();//调用公共方法,优先调用实例方法而不是prototype方法,当不存在实例方法时才会调用prototype方法
Class1.method();//调用静态方法,不能通过"对象.方法名"调用,只能用"类名.方法名"调用
Class1.prototype.method();//调用原型方法
-->
</script>

原型的作用:prototype和设计模式里的原型一样,使原型对象或方法预先创建一份,需要时复制使用,如还不明白去看设计模式
js中原型处理方式,prototype属于一个类的子对象,声明类时原型就存在且只有一份,当创建对象时,会先把prototype的所有成员都复制一份给对象,所以类的所有实例化对象都能获得原型的成员,当有同名成员时会优先调用实例对象的成员


5.arguments函数的参数集合,但并不是Array对象
例子1:传递给函数的隐含参数
<script language="JavaScript" type="text/javascript">
<!--
function func(a,b){
     alert(a);
     alert(b);
     for(var i=0;i<arguments.length;i++){
           alert(arguments[i]);
     }
}
func(1,2,3);//输出1 2 3
-->
</script>

例子2:arguments.callee表示调用函数本身
<script language="JavaScript" type="text/javascript">
<!--
var sum=function(n){
      if(1==n)return 1;
      else return n+arguments.callee(n-1);//这里arguments.callee相当于sum
}
alert(sum(100));
-->
</script>



6.函数的 apply、call 方法和 length 属性
语法:
Function.prototype.apply(thisArg,argArray);//@1为对象 @2为参数数组(数组可以容纳更多的参数)
Function.prototype.call(thisArg[,arg1[,arg2…]]);//@1为对象 @2为参数可多个...
说明:让prototype方法可以临时访问thisArg对象的成员,改变了this指针(指向thisArg对象),相当于java的内部类,c++的友员
例子:
<script language="JavaScript" type="text/javascript">
<!--
//定义一个函数 func1,具有属性 p 和方法 A
function func1(){
      this.p="func1-";
      this.A=function(arg){
            alert(this.p+arg);
      }
}
//定义一个函数 func2,具有属性 p 和方法 B
function func2(){
      this.p="func2-";
      this.B=function(arg){
            alert(this.p+arg);
      }
}
var obj1=new func1();
var obj2=new func2();
obj1.A.apply(obj2,["byA"]);    //显示 func2-byA,其中[“byA”]是仅有一个元素的数组,下同
obj2.B.apply(obj1,["byB"]);    //显示 func1-byB
obj1.A.call(obj2,"byA");       //显示 func2-byA
obj2.B.call(obj1,"byB");       //显示 func1-byB

//alert("last " + obj1.B("byB"));//临时指定B方法并不会加到obj1中去,取消此注释会报错,因为obj1中没有B方法
function sum(a,b){
      return a+b;
}
alert(sum.length);//输出sum定义时的参数个数而不管实际传入多少个参数
-->
</script>



7.在 JavaScript 中利用 for(…in…)语句实现反射
语法:
for(var p in obj){
      //语句
}
例子:
<script language="JavaScript" type="text/javascript">
<!--
setStyle({ color:#ffffff,backgroundColor:#ff0000,borderWidth:2px});

function setStyle(_style){
    //得到要改变样式的界面对象
      var element=getElement();//getElement返回一个html对象
          //用反射可以只更新_style对象里有的属性,而没有的仍然保持element.style里的原值
      for(var p in _style){
              element.style[p]=_style[p];
        }
}
-->
</script>



8.类的继承
方式一:利用共享 prototype 实现继承
<script language="JavaScript" type="text/javascript">
<!--
function classParent(){
}

classParent.prototype.method1 = function(){
    alert("classParent_method1");
}

classParent.prototype.method2 = function(){
    alert("classParent_method2");
}

function classChild(){
}

classChild.prototype = classParent.prototype;

classChild.prototype.methodNew = function(){
    alert("classChild_methodNew");
}

classChild.prototype.method2 = function(){
    alert("classChild_method2");
}

var obj = new classChild();
obj.method1();//输出classParent_method1
obj.method2();//输出classChild_method2
obj.methodNew();//输出classChild_methodNew
var objParent = new classParent();
objParent.method2();//输出classChild_method2,父类的方法也被子类覆盖了
-->
</script>

此方式会覆盖父类的方法,所以不太适用

方式二:利用反射机制和 prototype 实现继承
<script language="JavaScript" type="text/javascript">
<!--
//为类添加静态方法 inherit 表示继承于某类
Function.prototype.inherit = function(baseClass){
    for(var p in baseClass.prototype){
          this.prototype[p]=baseClass.prototype[p];
    }
}

function classParent(){
}

classParent.prototype = {
    method1:function(){
        alert("classParent_method1");
    },
    method2:function(){
        alert("classParent_method2");
    }
}

function classChild(){
}
classChild.inherit(classParent);
classChild.prototype.methodNew=function(){
    alert("classChild_methodNew");
};
classChild.prototype.method2=function(){
    alert("classChild_method2");
};

var obj = new classChild();
obj.method1();//输出classParent_method1
obj.method2();//输出classChild_method2
obj.methodNew();//输出classChild_methodNew
var objParent = new classParent();
objParent.method2();//输出classParent_method2,父类方法没有被覆盖
-->
</script>



9.在JavaScript实现接口或抽象类
<script language="JavaScript" type="text/javascript">
<!--
Function.prototype.inherit = function(baseClass){
    for(var p in baseClass.prototype){
          this.prototype[p]=baseClass.prototype[p];
    }
}

function Class1(){
   
}

Class1.prototype = {
    method:undefined//接口
};

function class2(){}
class2.inherit(Class1);
class2.prototype.method = function(){alert("has been implimented");};//实现接口

var obj = new class2();
obj.method();//不实现接口的话这句会报错
-->
</script>



10.js实现构造函数,同时也是实现接口的另一种方式
<script language="JavaScript" type="text/javascript">
<!--
//Class是一个全局对象,有一个方法create,用于返回一个类
var Class = {
    create: function() {
        return function() {
            this.initialize.apply(this, arguments);
        }
    }
}
var class1=Class.create();
class1.prototype={
    initialize:function(userName){
        alert("hello,"+userName);
    }
}

var obj = new class1("dd");//initialize方法会被调用
-->
</script>



11.事件
1)单个事件
<script language="JavaScript" type="text/javascript">
<!--
function Class1(){
    this.text = "";
}
Class1.prototype = {
    setText:function(text){
        this.text = text;
        this.OnTextChange(this.text);
    },
    OnTextChange:function(text){
    }//默认事件处理
}

var obj = new Class1();
obj.setText("text init");//无任何输出
//alert(obj.text);
obj.OnTextChange = function(text){//添加事件处理
    alert(text);
}
obj.setText("Text Chanaged");//输出"Text Chanaged"
-->
</script>


2)把全局变量传给事件
<script language="JavaScript" type="text/javascript">
<!--
function Class1(){
    this.text = "";
}
Class1.prototype = {
    setText:function(text){
        this.text = text;
        this.OnTextChange(this.text);
    },
    OnTextChange:function(text){
    }//默认事件处理
}

//创建function函数
function createFunction(obj,strFunc){
    var args=[];
    if(!obj)obj=window;
    for(var i=2;i<arguments.length;i++)
    args.push(arguments[i]);
    return function(){
        obj[strFunc].apply(obj,args);
    }
}

var obj = new Class1();

function OnTextChangeHandle(text){//全局事件
    alert(text);
}
var globalparams = "global params";
obj.OnTextChange = createFunction(null,"OnTextChangeHandle",globalparams);//绑定全局事件和参数
obj.setText("Text Chanaged");//输出"global params"
-->
</script>


3)注册多个事件
<script language="JavaScript" type="text/javascript">
<!--
function Class1(){
    this.text = "";
}
Class1.prototype = {
   
    OnTextChange:[],//事件数组
    setText:function(text){
        this.text = text;
        //通知调用OnTextChange事件
        for(var i = 0;i < this.OnTextChange.length;i++){
            this.OnTextChange[i](this.text);
        }
    },
    addOnTextChangeListener:function(_event){//添加注册事件方法
        //检查该事件是否已添加防止重复添加
        for(var i = 0;i < this.OnTextChange.length;i++){
            if(_event == this.OnTextChange[i]){
                return;
            }
        }
        this.OnTextChange.push(_event);
    },
    removeOnTextChangeListener:function(_event){//移除注册事件方法
        var arr = [];
        for(var i = 0;i < this.OnTextChange.length;i++){
            if(_event != this.OnTextChange[i]){
                arr.push(this.OnTextChange[i]);
            }
        }
        this.OnTextChange = arr;
    }


}

var obj = new Class1();

function MyOnTextChange1(text){
    alert("MyOnTextChange1:"+text);
}

function MyOnTextChange2(text){
    alert("MyOnTextChange2:"+text);
}

obj.addOnTextChangeListener(MyOnTextChange1);
obj.addOnTextChangeListener(MyOnTextChange1);//不会重复添加

obj.addOnTextChangeListener(MyOnTextChange2);

obj.setText("Text Chanaged 1");

obj.removeOnTextChangeListener(MyOnTextChange2);
obj.setText("Text Chanaged 2");
-->
</script>


12.js实现命名空间(此例同时展示了js中类的定义和调用)
<script language="JavaScript" type="text/javascript">
<!--
//声明
var com = new Object();//只能new一遍
           
if(com.briup == undefined){//防止重复定义
    com.briup = new Object();
}
           
com.briup.Class1 = function(){
    this.a = 10;       
};
           
com.briup.Class1.prototype = {
    print:function(){
        alert(this.a);
    }
};

if(com.briup == undefined){
    com.briup = new Object();
}
           
if(com.briup.hrtc == undefined){
    com.briup.hrtc = new Object();
}           
com.briup.hrtc.Class2 = function(){
    this.b = 20;           
};
           
com.briup.hrtc.Class2.prototype = {
    print:function(){
        alert(this.b);
    }
};

//调用
var obj1 = new com.briup.Class1();
obj1.print();
           
var obj2 = new com.briup.hrtc.Class2();
obj2.print();

-->
</script>

准备看第七章,看完再写,希望能与大家共同学习。
17
9
分享到:
评论
1 楼 jbla 2008-03-18  
写的很好,经验之谈

相关推荐

    《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析

    本文实例讲述了Javascript面向对象程序设计对象成员的定义。分享给大家供大家参考,具体如下: 序: 刚接触javascript的时候,觉得这语言有点儿摸不着门道,感觉这玩意儿太难学了,没什么规范,没什么像样的手册,...

    《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析

    链式调用是一种编程技术,在这种技术中,...通过学习链式调用的原理和实践技巧,我们不仅可以更加高效地利用JavaScript面向对象的特性,还能够编写出更加简洁和优雅的代码。希望本文所述对JavaScript程序设计有所助益。

    javascript入门学习笔记

    这些只是JavaScript学习笔记的一部分,深入理解并熟练运用这些概念,将为JavaScript编程打下坚实的基础。随着学习的深入,还会接触到更多高级特性和框架,如闭包、原型链、AJAX、jQuery、Vue.js、React.js等,这些都...

    JavaScript 入门 新手学习笔记

    这篇"JavaScript入门新手学习笔记"提供了全面的学习资源,适合初学者系统性地掌握这一技术。 笔记可能包含了以下关键知识点: 1. **基础语法**:JS的基础包括变量(var、let、const)、数据类型(如字符串、数字、...

    JavaScript高级程序设计2,学习笔记---第一篇

    这篇学习笔记将带你探索JavaScript的核心概念,包括变量、数据类型、控制流、函数、对象和类等,这些都是构建复杂应用程序的基础。 首先,我们要了解JavaScript的基础语法。在JavaScript中,变量是存储数据的容器,...

    javascript学习笔记

    Java是由SUN公司开发的一种面向对象的编程语言,主要用于服务器端编程和数据库操作,是一种强类型的、编译型的语言。而JavaScript则是一种轻量级的、解释型的脚本语言,主要运行在浏览器上,用于处理前端逻辑,实现...

    Javasript与AJAX全程笔记+代码

    4. **面向对象编程**:JavaScript的面向对象特性,如构造函数、原型链、继承和封装。 5. **AJAX请求**:创建XMLHttpRequest对象,理解其生命周期,发送GET和POST请求,处理响应数据。 6. **Promise和async/await**...

    Struts、Spring、Hibernate&Ajax;学习笔记总结

    ### Struts、Spring、Hibernate&Ajax 学习笔记总结 #### Struts 部分 **Struts** 是 Java 开源框架中最早出现且最具影响力的框架之一,它出自 Apache 组织,是 Java Web 应用开发的标准之一。Struts 以 MVC(Model...

    Java学习笔记CCS AJAX DMS JSP servlet JavaScript等中文笔记整理.rar

    Java是一种广泛使用的面向对象的编程语言,其特点包括平台独立性、丰富的类库以及强大的内存管理机制。在这些学习笔记中,你可以深入理解Java的核心概念,包括语法、数据类型、控制结构、类与对象,以及异常处理等。...

    JavaScript学习笔记 概括了所有的javaScript语法 用法

    JavaScript,作为全球最广泛使用的编程语言之一,是前端开发的核心技术。...本学习笔记将这些知识点结合实例详细阐述,配合其他资源一同学习,能让你对JavaScript有一个全面且深入的理解,助你在Web开发领域游刃有余。

    java unix sping ajax struts hibernate 学习笔记

    "Ajax学习笔记"涵盖了异步JavaScript和XML技术,使网页可以实现局部刷新,提高用户体验。虽然现代Web开发中更多的使用了Fetch API和JSON,但了解Ajax的历史和工作原理仍然很有价值。 "Spring学习笔记"聚焦于Spring...

    JavaScript学习笔记讲解

    这只是JavaScript学习笔记的一小部分,JavaScript还有更多高级特性和概念,如对象、数组、函数、类、模块、闭包等,以及DOM操作、事件处理、Ajax异步请求等内容,需要进一步深入学习和实践才能掌握。

    h5前端学习笔记

    7. **面向对象补充.md**:JavaScript支持面向对象编程,此文件可能探讨了类、构造函数、继承、封装等面向对象的概念和技巧。 8. **javascript时间戳和日期字符串相互转换.txt**:这部分内容可能讲解了JavaScript中...

    javaScript学习笔记.rar

    这个“javaScript学习笔记.rar”压缩包显然包含了作者在学习JavaScript过程中的心得和记录,对于初学者或者想要深入理解JavaScript的人来说,是一份宝贵的资源。 JavaScript与Java虽然名字相似,但两者实际上是不同...

    Ajax总结和java框架学习笔记

    ### Ajax技术概述与Java框架学习笔记 #### 一、Ajax技术简介 Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,...

    JavaScript入门学习笔记.pdf

    JavaScript与Java虽然名字相似,但两者是完全不同的语言,JavaScript主要是在客户端的浏览器上运行,而Java则是一种更通用的面向对象的编程语言。 JavaScript的核心特性包括: 1. **事件驱动**:JavaScript可以对...

    JavaScript 学习笔记集和代码库

    压缩包中的“JavaScript学习笔记集”可能包含了语言的基本概念、语法特性、面向对象编程、闭包、原型链、作用域、异步编程等内容的详细解释。而“代码库”可能包含了大量的示例代码,涵盖各种常见任务,如表单验证、...

    JavaScript练习程序学习笔记.rar

    这份“JavaScript练习程序学习笔记”很可能包含了一系列的代码示例、学习心得和常见问题解答,旨在帮助学习者深入理解和掌握JavaScript编程。 在JavaScript的学习过程中,首先会接触到基础语法,包括变量声明(var...

Global site tag (gtag.js) - Google Analytics