看了《征服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>
准备看第七章,看完再写,希望能与大家共同学习。
分享到:
相关推荐
本文实例讲述了Javascript面向对象程序设计对象成员的定义。分享给大家供大家参考,具体如下: 序: 刚接触javascript的时候,觉得这语言有点儿摸不着门道,感觉这玩意儿太难学了,没什么规范,没什么像样的手册,...
链式调用是一种编程技术,在这种技术中,...通过学习链式调用的原理和实践技巧,我们不仅可以更加高效地利用JavaScript面向对象的特性,还能够编写出更加简洁和优雅的代码。希望本文所述对JavaScript程序设计有所助益。
这些只是JavaScript学习笔记的一部分,深入理解并熟练运用这些概念,将为JavaScript编程打下坚实的基础。随着学习的深入,还会接触到更多高级特性和框架,如闭包、原型链、AJAX、jQuery、Vue.js、React.js等,这些都...
这篇"JavaScript入门新手学习笔记"提供了全面的学习资源,适合初学者系统性地掌握这一技术。 笔记可能包含了以下关键知识点: 1. **基础语法**:JS的基础包括变量(var、let、const)、数据类型(如字符串、数字、...
这篇学习笔记将带你探索JavaScript的核心概念,包括变量、数据类型、控制流、函数、对象和类等,这些都是构建复杂应用程序的基础。 首先,我们要了解JavaScript的基础语法。在JavaScript中,变量是存储数据的容器,...
Java是由SUN公司开发的一种面向对象的编程语言,主要用于服务器端编程和数据库操作,是一种强类型的、编译型的语言。而JavaScript则是一种轻量级的、解释型的脚本语言,主要运行在浏览器上,用于处理前端逻辑,实现...
4. **面向对象编程**:JavaScript的面向对象特性,如构造函数、原型链、继承和封装。 5. **AJAX请求**:创建XMLHttpRequest对象,理解其生命周期,发送GET和POST请求,处理响应数据。 6. **Promise和async/await**...
### Struts、Spring、Hibernate&Ajax 学习笔记总结 #### Struts 部分 **Struts** 是 Java 开源框架中最早出现且最具影响力的框架之一,它出自 Apache 组织,是 Java Web 应用开发的标准之一。Struts 以 MVC(Model...
Java是一种广泛使用的面向对象的编程语言,其特点包括平台独立性、丰富的类库以及强大的内存管理机制。在这些学习笔记中,你可以深入理解Java的核心概念,包括语法、数据类型、控制结构、类与对象,以及异常处理等。...
JavaScript,作为全球最广泛使用的编程语言之一,是前端开发的核心技术。...本学习笔记将这些知识点结合实例详细阐述,配合其他资源一同学习,能让你对JavaScript有一个全面且深入的理解,助你在Web开发领域游刃有余。
"Ajax学习笔记"涵盖了异步JavaScript和XML技术,使网页可以实现局部刷新,提高用户体验。虽然现代Web开发中更多的使用了Fetch API和JSON,但了解Ajax的历史和工作原理仍然很有价值。 "Spring学习笔记"聚焦于Spring...
这只是JavaScript学习笔记的一小部分,JavaScript还有更多高级特性和概念,如对象、数组、函数、类、模块、闭包等,以及DOM操作、事件处理、Ajax异步请求等内容,需要进一步深入学习和实践才能掌握。
7. **面向对象补充.md**:JavaScript支持面向对象编程,此文件可能探讨了类、构造函数、继承、封装等面向对象的概念和技巧。 8. **javascript时间戳和日期字符串相互转换.txt**:这部分内容可能讲解了JavaScript中...
这个“javaScript学习笔记.rar”压缩包显然包含了作者在学习JavaScript过程中的心得和记录,对于初学者或者想要深入理解JavaScript的人来说,是一份宝贵的资源。 JavaScript与Java虽然名字相似,但两者实际上是不同...
### Ajax技术概述与Java框架学习笔记 #### 一、Ajax技术简介 Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,...
JavaScript与Java虽然名字相似,但两者是完全不同的语言,JavaScript主要是在客户端的浏览器上运行,而Java则是一种更通用的面向对象的编程语言。 JavaScript的核心特性包括: 1. **事件驱动**:JavaScript可以对...
压缩包中的“JavaScript学习笔记集”可能包含了语言的基本概念、语法特性、面向对象编程、闭包、原型链、作用域、异步编程等内容的详细解释。而“代码库”可能包含了大量的示例代码,涵盖各种常见任务,如表单验证、...
这份“JavaScript练习程序学习笔记”很可能包含了一系列的代码示例、学习心得和常见问题解答,旨在帮助学习者深入理解和掌握JavaScript编程。 在JavaScript的学习过程中,首先会接触到基础语法,包括变量声明(var...