第三章 JavaScript面向对象编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.添加与已有方法无关的方法 例如,假设要判断某个项在数组中的位置,没有本地方法 可以做这种事情。我们可以轻松地创建下面的方法: Array.prototype.indexOf = function (vItem) { for (var i=0; i<this.length; i++) { if (vItem == this[i]) { return i; } } return -1; }
3.1.3 arguments 对象 用来保存函数的相关参数信息。第一个参数保存 在arguments[0],第二个arguments[1],依此类 推。 1. length属性 返回函数的参数个数。 2. callee 获取正在执行函数的引用。 3. caller 指向调用当前函数的父函数的引用。
一个函数可以有多个名字 function sum(num1, num2){ return num1 + num2; } alert(sum(10,10)); //20
var anotherSum = sum; alert(anotherSum(10,10)); //20 sum = null; alert(anotherSum(10,10)); //20
参数之间用逗号隔开,也可以没有参数。 函数可以有返回值,也可以没有返回值。 return 语句后的代码都不会被执行。一个函数里 面可以出现多个return语句,但只会返回一个 return的结果。 function sum(iNum1, iNum2) { return iNum1 + iNum2; alert(iNum1 + iNum2); //无法执行 }
3.2.2 prototype prototype属性为任何已有的类定义新方法,就像处理自己的类一样。 每个对象(Object)都有prototype属性。 在实例上不能使用prototype。
1.重命名已有方法 例如,可以给 Array 类添加两个方法 enqueue() 和 dequeue(),只让 它们反复调用已有的 push() 和 shift() 方法即可:
3.1.6 闭包 函数定义和函数表达式位于另一个函数的函数体内。它可 以访问它所在的外部函数中的变量、参数等。 var iBaseNum = 10; function addNum(iNum1, iNum2) { function doAdd() { return iNum1 + iNum2 + iBaseNum; } return doAdd(); } 函数 doAdd() 是一个闭包,它将获取外部函数的参数 iNum1 和 iNum2 以及全局变量 iBaseNum 的值。 doAdd() 函数根本不接受参数,它使用的值是从执行环境 中获取的。
Array.prototype.enqueue = function(vItem) { this.push(vItem); };
Array.prototype.dequeue = function() { return this.shift(); };
Array.prototype.enqueue = function(vItem) { this.push(vItem); };
function hello(){ alert("hello"); }
var obj = new hello(); alert(typeof obj); alert(111); var temp = hello(); alert(typeof temp); 在JavaScript中,函数和类就是一个概念,当new 一个函数时,就会返回一个对象,如果这个函数 中没有初始化类成员,那就会返回一个空对象。
3.2 面向对象编程
3.2.1 类 表示具有相似性质的一类事物的抽象集合。 定义类: function Class1(){ //类成员的定义,构造函数 } 获取类的实例: var obj1 = new Class1(); class1也是一个函数,那么是不是所有的函数都可以用 new来操作。
var oCar2 = new Object; oCar2.color = "blue"; oCar2.showColor = showColor;
oCar1.showColor(); oCar2.showColor();
引用对象的属性时,必须使用 this 关键字。例如, 如果采用下面的代码,showColor() 方法不能运 行: function showColor() { alert(color); }; 如果不用对象或 this 关键字引用变量, ECMAScript 就会把它看作局部变量或全局变量。 然后该函数将查找名为 color 的局部或全局变量, 但是不会找到。
function factorial(num){ if (num <= 1) { return 1; } else { return num * factorial (num-1); } }
function factorial(num){ if (num <= 1) { return 1; } else { return num * arguments.callee(num-1); } }
function test(num1, num2){ return num1 + num2; } var temp = function(num1, num2){ return num1 + num2; }; var sum = new Function("num1", "num2", "return num1 + num2;"); alert(typeof test); alert(typeof temp); alert(typeof sum); var _test = test(1,1); var _temp = temp(1,1); var _sum = sum(1,1); alert(_test); alert(_temp); alert(_sum);
Array.prototype.unqueue = function(vItem) { if(arguments.length > 1){ alert("必须传入一个参数"); return; } return this.unshift(vItem); /* for(var i = 0; i < arguments.length; i++) var _array = this.unshift(arguments[i]); return _array; */ }; var _array = new Array(); var count = _array.enqueue("yellow"); count = _array.enqueue("black"); count = _array.enqueue("green"); alert(_array); var _array2 = new Array(); count = _array2.unqueue("yellow","black","green"); alert(_array2);
<script> function test(){ alert(111); } //test(); </script> abc
来自百度文库
函数实际上是对象,每个函数都是Function类型 的实例,而且与其他引用类型一样具有属性和方 法。可以将函数名理解成一个指向对象的指针。 3.1.1 函数声明的三种方法: 1. function 函数名(参数列表){ 程序代码 return //可有可无 alert(“1232”); }
function diff(iNum1, iNum2) { if (iNum1 > iNum2) { return iNum1 - iNum2; } else { return iNum2 - iNum1; } }
2. var sum = funtion (num1, num2){ return num1 + num2; }; 通过变量sum即可引用函数。 末尾有分号,如同声明变量一样。 3. 用 Function 类直接创建函数 var sum = new Function("num1","num2","return num1 + num2;");
3.1.2 函数中的变量 当在函数内声明了一个变量后,就只能在该函数中访问该 变量。当退出该函数后,这个变量会被撤销,这种变量称 为局部变量。可以在不同的函数中使用名称相同的局部变 量,这是因为只有声明过变量的函数能够识别其中的每个 变量。
var msg = "全局变量"; function show() { var msg = "局部变量"; alert(msg); } function square(x,y){ var sum; sum = x + y; return sum; } sum = square(2,3); alert("sum=" + sum); show(); alert(msg);
关键字 this 用在对象的 showColor() 方法中。在此环境中, this 等于 oCar。下面的代码与上面的代码的功能相同: var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(oCar.color); };
为什么使用 this? 因为在实例化对象时,总是不能确定开发者会使用什么样的变量名。 使用 this,即可在任何多个地方重用同一个函数。
function showColor() { alert(this.color); }; var oCar1 = new Object; oCar1.color = "red"; oCar1.showColor = showColor;
3.1.4 apply()和call() 都可以将函数绑定到其他对象上执行。 1. apply() 接受两个参数,一个是在其运行函数的作用域, 另一个是参数组。 2. call() 第一个参数是在其运行函数的作用域,接下来的 参数必须逐个列举出来。
JavaScript程序设计教程
软件学院
胡 沛 2016年9月
第三章 JavaScript面向对象编程
掌握JavaScript中函数的定义(关键字, 参数,返回值) 知道类和对象,以及如何访问对象的方法
3.1 JavaScript中的函数
通常在进行一个复杂的程序设计时,总是根据所 要完成的功能,将程序划分为一些相对独立的部 分,每部分编写一个函数。从而,使各部分充分 独立,任务单一,程序清晰,易懂、易读、易维 护。 函数定义并不会自动执行,只有被调用时才会执 行,调用语句中包含函数名或参数值。
3.1.5 this关键字 this总是指向调用该方法的对象,例如: var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(this.color); }; oCar.showColor(); //输出 "red“