Javascript面向对象基础三-函数
2011-03-01 21:12
716 查看
函数
javascript
函数相信大家都写过不少了,
所以我们这里只是简单介绍一下.
创建函数:
function f(x) {........}
var f = function(x) {......}
上面这两种形式都可以创建名为f()
的函数,
不过后一种形式可以创建匿名函数
函数定义时可以设置参数,
如果传给函数的参数个数不够,
则从最左边起依次对应,
其余的用undefined
赋值,
如果传给函数的参数多于函数定义参数的个数,
则多出的参数被忽略.
Js
代码
function myprint(s1,s2,s3) {
alert(s1+"_"+s2+"_"+s3);
}
myprint(); //undefined_undefined_undefined
myprint("string1","string2"); //string1_string2_undefined
myprint("string1","string2","string3","string4"); //string1_string2_string3
function myprint(s1,s2,s3) {
alert(s1+"_"+s2+"_"+s3);
}
myprint();
//undefined_undefined_undefined
myprint("string1","string2");
//string1_string2_undefined
myprint("string1","string2","string3","string4");
//string1_string2_string3
因此,
对于定义好的函数,
我们不能指望调用者将所有的参数全部传进来.
对于那些必须用到的参数应该在函数体中加以检测(
用!
操作符),
或者设置默认值然后同参数进行或(||)
操作来取得参数.
Js
代码
function myprint(s1,person) {
var defaultperson = { //
默认person
对象
"name":"name1",
"age":18,
"sex":"female"
};
if(!s1) { //s1
不允许为空
alert("s1 must be input!");
return false;
}
person = person || defaultperson; //
接受person
对象参数
alert(s1+"_"+person.name+":"+person.age+":"+person.sex);
};
myprint(); //s1 must be input!
myprint("s1"); //s1_name1:18:female
myprint("s1",{"name":"sdcyst","age":23,"sex":"male"}); //s1_sdcyst:23:male
function myprint(s1,person) {
var defaultperson = {
//
默认person
对象
"name":"name1",
"age":18,
"sex":"female"
};
if(!s1) {
//s1
不允许为空
alert("s1 must be
input!");
return false;
}
person = person ||
defaultperson;
//
接受person
对象参数
alert(s1+"_"+person.name+":"+person.age+":"+person.sex);
};
myprint(); //s1 must be input!
myprint("s1"); //s1_name1:18:female
myprint("s1",{"name":"sdcyst","age":23,"sex":"male"});
//s1_sdcyst:23:male
函数的arguments
属性
在每一个函数体的内部,
都有一个arguments
标识符,
这个标识符代表了一个Arguments
对象.Arguments
对象非常类似于Array(
数组)
对象,
比如都有length
属性,
访问它的值用"[]"
操作符利用索引来访问参数值,
但是,
二者是完全不同的东西,
仅仅是表面上有共同点而已(
比如说修改Arguments
对象的length
属性并不会改变它的长度).
Js
代码
function myargs() {
alert(arguments.length);
alert(arguments[0]);
}
myargs(); //0 --- undefined
myargs("1",[1,2]); //2 --- 1
function myargs() {
alert(arguments.length);
alert(arguments[0]);
}
myargs();
//0
---
undefined
myargs("1",[1,2]);
//2 --- 1
Arguments
对象有一个callee
属性,
标示了当前Arguments
对象所在的方法.
可以使用它来实现匿名函数的内部递归调用.
Js
代码
function(x) {
if (x <= 1) return 1;
return x * arguments.callee(x-1);
}
function(x) {
if (x <= 1) return 1;
return x *
arguments.callee(x-1);
}
(section8.2)
Method--
方法
方法就是函数.
我们知道,
每一个对象都包含0
个或多个属性,
属性可以是任意类型,
当然也包括对象.
函数本身就是一种对象,
因此我们完全可以把一个函数放到一个对象里面,
此时,
这个函数就成了对象的一个方法.
此后如果要使用该方法,
则可以通过对象名利用"."
操作符来实现.
Js
代码
var obj = {f0:function(){alert("f0");}}; //
对象包含一个方法
function f1() {alert("f1");}
obj.f1 = f1; //
为对象添加方法
obj.f0(); //f0 f0
是obj
的方法
obj.f1(); //f1 f1
是obj
的方法
f1(); //f1 f1
同时又是一个函数,
可以直接调用
f0(); //f0
仅仅是obj
的方法,
只能通过对象来调用
var obj =
{f0:function(){alert("f0");}}; //
对象包含一个方法
function f1()
{alert("f1");}
obj.f1 = f1;
//
为对象添加方法
obj.f0(); //f0
f0
是obj
的方法
obj.f1(); //f1
f1
是obj
的方法
f1();
//f1
f1
同时又是一个函数,
可以直接调用
f0();
//f0
仅仅是obj
的方法,
只能通过对象来调用
方法的调用需要对象的支持,
那么在方法中如何获取对象的属性呢?this!this
关键字我们已经很熟悉了,
在javascript
的方法中,
我们可以用this
来取得对方法调用者(
对象)
的引用,
从而获取方法调用者的各种属性.
Js
代码
var obj = {"name":"NAME","sex":"female"};
obj.print = function() { //
为对象添加方法
alert(this.name + "_" + this["sex"]);
};
obj.print(); //NAME_female
obj.sex = "male";
obj.print(); //NAME_male
var obj =
{"name":"NAME","sex":"female"};
obj.print = function() {
//
为对象添加方法
alert(this.name + "_" +
this["sex"]);
};
obj.print();
//NAME_female
obj.sex = "male";
obj.print();
//NAME_male
下面我们来一个更加面向对象的例子.
Js
代码
var person = {
name:"defaultname",
setName:function(s){
this.name = s;
},
"printName":function(){
alert(this.name);
}
}
person.printName(); //defaultname
person.setName("newName");
person.printName(); //newName
var person =
{name:"defaultname",
setName:function(s){
this.name = s;
},
"printName":function(){
alert(this.name);
}}
person.printName();
//defaultname
person.setName("newName");
person.printName();
//newName
在上面的例子中,
完全可以用person.name=..
来直接改变person
的name
属性,
在此我们只是为了展示一下刚才提到的内容.
另一种改变person
属性的方法就是:
定义一个function,
接收两个参数,
一个是person,
一个是name
的值,
看起来像是这样:changeName(person,"newName").
哪种方法好呢?
很明显,
例子中的方法更形象,
更直观一些,
而且好像有了那么一点面向对象的影子.
再次强调一下,
方法(Method)
本身就是是函数(function),
只不过方法的使用更受限制.
在后面的篇幅中,
如果提到函数,
那么提到的内容同样适用于方法,
反之则不尽然.
javascript
函数相信大家都写过不少了,
所以我们这里只是简单介绍一下.
创建函数:
function f(x) {........}
var f = function(x) {......}
上面这两种形式都可以创建名为f()
的函数,
不过后一种形式可以创建匿名函数
函数定义时可以设置参数,
如果传给函数的参数个数不够,
则从最左边起依次对应,
其余的用undefined
赋值,
如果传给函数的参数多于函数定义参数的个数,
则多出的参数被忽略.
Js
代码
function myprint(s1,s2,s3) {
alert(s1+"_"+s2+"_"+s3);
}
myprint(); //undefined_undefined_undefined
myprint("string1","string2"); //string1_string2_undefined
myprint("string1","string2","string3","string4"); //string1_string2_string3
function myprint(s1,s2,s3) {
alert(s1+"_"+s2+"_"+s3);
}
myprint();
//undefined_undefined_undefined
myprint("string1","string2");
//string1_string2_undefined
myprint("string1","string2","string3","string4");
//string1_string2_string3
因此,
对于定义好的函数,
我们不能指望调用者将所有的参数全部传进来.
对于那些必须用到的参数应该在函数体中加以检测(
用!
操作符),
或者设置默认值然后同参数进行或(||)
操作来取得参数.
Js
代码
function myprint(s1,person) {
var defaultperson = { //
默认person
对象
"name":"name1",
"age":18,
"sex":"female"
};
if(!s1) { //s1
不允许为空
alert("s1 must be input!");
return false;
}
person = person || defaultperson; //
接受person
对象参数
alert(s1+"_"+person.name+":"+person.age+":"+person.sex);
};
myprint(); //s1 must be input!
myprint("s1"); //s1_name1:18:female
myprint("s1",{"name":"sdcyst","age":23,"sex":"male"}); //s1_sdcyst:23:male
function myprint(s1,person) {
var defaultperson = {
//
默认person
对象
"name":"name1",
"age":18,
"sex":"female"
};
if(!s1) {
//s1
不允许为空
alert("s1 must be
input!");
return false;
}
person = person ||
defaultperson;
//
接受person
对象参数
alert(s1+"_"+person.name+":"+person.age+":"+person.sex);
};
myprint(); //s1 must be input!
myprint("s1"); //s1_name1:18:female
myprint("s1",{"name":"sdcyst","age":23,"sex":"male"});
//s1_sdcyst:23:male
函数的arguments
属性
在每一个函数体的内部,
都有一个arguments
标识符,
这个标识符代表了一个Arguments
对象.Arguments
对象非常类似于Array(
数组)
对象,
比如都有length
属性,
访问它的值用"[]"
操作符利用索引来访问参数值,
但是,
二者是完全不同的东西,
仅仅是表面上有共同点而已(
比如说修改Arguments
对象的length
属性并不会改变它的长度).
Js
代码
function myargs() {
alert(arguments.length);
alert(arguments[0]);
}
myargs(); //0 --- undefined
myargs("1",[1,2]); //2 --- 1
function myargs() {
alert(arguments.length);
alert(arguments[0]);
}
myargs();
//0
---
undefined
myargs("1",[1,2]);
//2 --- 1
Arguments
对象有一个callee
属性,
标示了当前Arguments
对象所在的方法.
可以使用它来实现匿名函数的内部递归调用.
Js
代码
function(x) {
if (x <= 1) return 1;
return x * arguments.callee(x-1);
}
function(x) {
if (x <= 1) return 1;
return x *
arguments.callee(x-1);
}
(section8.2)
Method--
方法
方法就是函数.
我们知道,
每一个对象都包含0
个或多个属性,
属性可以是任意类型,
当然也包括对象.
函数本身就是一种对象,
因此我们完全可以把一个函数放到一个对象里面,
此时,
这个函数就成了对象的一个方法.
此后如果要使用该方法,
则可以通过对象名利用"."
操作符来实现.
Js
代码
var obj = {f0:function(){alert("f0");}}; //
对象包含一个方法
function f1() {alert("f1");}
obj.f1 = f1; //
为对象添加方法
obj.f0(); //f0 f0
是obj
的方法
obj.f1(); //f1 f1
是obj
的方法
f1(); //f1 f1
同时又是一个函数,
可以直接调用
f0(); //f0
仅仅是obj
的方法,
只能通过对象来调用
var obj =
{f0:function(){alert("f0");}}; //
对象包含一个方法
function f1()
{alert("f1");}
obj.f1 = f1;
//
为对象添加方法
obj.f0(); //f0
f0
是obj
的方法
obj.f1(); //f1
f1
是obj
的方法
f1();
//f1
f1
同时又是一个函数,
可以直接调用
f0();
//f0
仅仅是obj
的方法,
只能通过对象来调用
方法的调用需要对象的支持,
那么在方法中如何获取对象的属性呢?this!this
关键字我们已经很熟悉了,
在javascript
的方法中,
我们可以用this
来取得对方法调用者(
对象)
的引用,
从而获取方法调用者的各种属性.
Js
代码
var obj = {"name":"NAME","sex":"female"};
obj.print = function() { //
为对象添加方法
alert(this.name + "_" + this["sex"]);
};
obj.print(); //NAME_female
obj.sex = "male";
obj.print(); //NAME_male
var obj =
{"name":"NAME","sex":"female"};
obj.print = function() {
//
为对象添加方法
alert(this.name + "_" +
this["sex"]);
};
obj.print();
//NAME_female
obj.sex = "male";
obj.print();
//NAME_male
下面我们来一个更加面向对象的例子.
Js
代码
var person = {
name:"defaultname",
setName:function(s){
this.name = s;
},
"printName":function(){
alert(this.name);
}
}
person.printName(); //defaultname
person.setName("newName");
person.printName(); //newName
var person =
{name:"defaultname",
setName:function(s){
this.name = s;
},
"printName":function(){
alert(this.name);
}}
person.printName();
//defaultname
person.setName("newName");
person.printName();
//newName
在上面的例子中,
完全可以用person.name=..
来直接改变person
的name
属性,
在此我们只是为了展示一下刚才提到的内容.
另一种改变person
属性的方法就是:
定义一个function,
接收两个参数,
一个是person,
一个是name
的值,
看起来像是这样:changeName(person,"newName").
哪种方法好呢?
很明显,
例子中的方法更形象,
更直观一些,
而且好像有了那么一点面向对象的影子.
再次强调一下,
方法(Method)
本身就是是函数(function),
只不过方法的使用更受限制.
在后面的篇幅中,
如果提到函数,
那么提到的内容同样适用于方法,
反之则不尽然.
相关文章推荐
- javascript 面向对象基础(一)对象组成及函数封装
- JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)
- JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)
- [推荐]javascript 面向对象技术基础教程
- JavaScript 面向对象基础总结
- javascript:apply函数在面向对象中的用法
- JavaSE 拾遗(3)——JavaSE 面向对象程序设计语言基础(3)...函数
- Javascript基础教程之函数对象和属性
- javascript 设计模式之单体模式 面向对象学习基础
- JavaScript基础学习笔记(四) ---面向对象的程序设计
- javascript: 面向对象基础知识
- JavaScript--面向对象基础
- javascript面向对象基础
- javascript面向对象基础知识记录1
- JavaScript面向对象基础
- JavaScript基础_04对象与函数
- Javascript基础与面向对象基础~第二讲 Javascript中的变量及变量的类型
- javascript面向对象基础——作用域、闭包、模拟私有属性
- javascript 面向对象技术基础教程第1/2页
- JavaScript 面向对象程序设计 变量,函数定义之不可不知