http://www.javaeye.com/wiki/Object_Oriented_JavaScript/1279-javascript-object-oriented-technology-one),只进行了重新排版以便收藏?br />
文中所有英文语?E序语句除外)Q都引自<<javascript-the definitive guide,5th edition>>?br />
------------------------------------------------------------------------------------
函数
javascript函数怿大家都写q不了,所以我们这里只是简单介l一下?br />
创徏函数:
function f(x) {........}
var f = function(x) {......}
上面q两UŞ式都可以创徏名ؓf()的函敎ͼ不过后一UŞ式可以创建匿名函数。函数定义时可以讄参数Q如果传l函数的参数个数不够Q则从最左边起依ơ对应,其余的用undefined赋|如果传给函数的参数多于函数定义参数的个数Q则多出的参数被忽略?br />
1
function myprint(s1,s2,s3)
{
2
alert(s1+"_"+s2+"_"+s3);
3
}
4
myprin(); //undefined_undefined_undefined
5
myprint("string1","string2"); //string1_string2_undefined
6
myprint("string1","string2","string3","string4"); //string1_string2_string3
因此Q对于定义好的函敎ͼ我们不能指望调用者将所有的参数全部传进来。对于那些必ȝ到的参数应该在函C中加以检??操作W?Q或者设|默认值然后同参数q行?||)操作来取得参数?br />
1
function myprint(s1,person)
{
2
var defaultperson =
{ //默认person对象
3
"name":"name1",
4
"age":18,
5
"sex":"female"
6
};
7
if(!s1)
{ //s1不允ؓI?nbsp;
8
alert("s1 must be input!");
9
return false;
10
}
11
person = person || defaultperson; //接受person对象参数
12
alert(s1+"_"+person.name+":"+person.age+":"+person.sex);
13
};
14
15
myprint(); //s1 must be input!
16
myprint("s1"); //s1_name1:18:female
17
myprint("s1",
{"name":"sdcyst","age":23,"sex":"male"}); //s1_sdcyst:23:male
函数的arguments属?br />
在每一个函C的内部,都有一个arguments标识W,q个标识W代表了一个Arguments对象。Arguments对象非常cM于Array(数组)对象Q比如都有length属性,讉K它的值用"[]"操作W利用烦引来讉K参数倹{但是,二者是完全不同的东西,仅仅是表面上有共同点而已(比如说修改Arguments对象的length属性ƈ不会改变它的长度)?br />
1
function myargs()
{
2
alert(arguments.length);
3
alert(arguments[0]);
4
}
5
myargs(); //0 --- undefined
6
myargs("1",[1,2]); //2 --- 1
Arguments对象有一个callee属性,标示了当前Arguments对象所在的Ҏ。可以用它来实现匿名函数的内部递归调用?br />
1
function(x)
{
2
if (x <= 1) return 1;
3
return x * arguments.callee(x-1);
4
} (section8.2)
------------------------------------------------------------------
Method--Ҏ
Ҏ是函数。我们知道,每一个对象都包含0个或多个属性,属性可以是LcdQ当然也包括对象。函数本w就是一U对象,因此我们完全可以把一个函数放C个对象里面,此时Q这个函数就成了对象的一个方法。此后如果要使用该方法,则可以通过对象名利?."操作W来实现?br />
1
var obj =
{f0:function()
{alert("f0");}}; //对象包含一个方?nbsp;
2
function f1()
{alert("f1");}
3
obj.f1 = f1; //为对象添加方?nbsp;
4
5
obj.f0(); //f0 f0是obj的方?nbsp;
6
obj.f1(); //f1 f1是obj的方?nbsp;
7
f1(); //f1 f1同时又是一个函?可以直接调用
8
f0(); //f0仅仅是obj的方?只能通过对象来调?nbsp;
Ҏ的调用需要对象的支持Q那么在Ҏ中如何获取对象的属性呢Qthis!this关键字我们已l很熟悉了,在javascript的方法中Q我们可以用this来取得对Ҏ调用?对象)的引用,从而获取方法调用者的各种属性?br />
1
var obj =
{"name":"NAME","sex":"female"};
2
obj.print = function()
{ //为对象添加方?nbsp;
3
alert(this.name + "_" + this["sex"]);
4
};
5
obj.print(); //NAME_female
6
obj.sex = "male";
7
obj.print(); //NAME_male
下面我们来一个更加面向对象的例子Q?br />
1
var person =
{name:"defaultname",
2
setName:function(s)
{
3
this.name = s;
4
},
5
"printName":function()
{
6
alert(this.name);
7
}}
8
person.printName(); //defaultname
9
person.setName("newName");
10
person.printName(); //newName
在上面的例子中,完全可以用person.name=..来直接改变person的name属性,在此我们只是Z展示一下刚才提到的内容?br />
另一U改变person属性的Ҏ是Q定义一个functionQ接收两个参敎ͼ一个是personQ一个是name的|看v来像是这PchangeName(person,"newName")。哪U方法好?很明显,例子中的Ҏ更Ş象,更直观一些,而且好像有了那么一炚w向对象的影子?br />
再次一下,Ҏ(Method)本n是是函?function)Q只不过Ҏ的用更受限制。在后面的篇q中Q如果提到函敎ͼ那么提到的内容同样适用于方法,反之则不然?br />
函数的prototype属?/strong>
每一个函数都包含了一个prototype(原型)属性,q个属性构成了javascript面向对象的核心基。在后面我们会详l讨论?

]]>