原文 Quick guide to somewhat advanced JavaScript tour of some OO features
出处
http://www.sergiopereira.com/articles/advjs.html什么是JSON? JavaScript Object Notation -------javascript对象符号,一个Ajax中砰然出现的新话题.其实它就是javascript中申明对象的方法。让我们来看一个示例
var myPet =
{
color: 'black',
leg_count: 4,
communicate: function(repeatCount){
for(i=0;i<repeatCount;i++) alert('Woof!');}
};
这里我们就创建了一个对象引用,这个对象包含了2个属性(color,leg_count)和一个方法(communicate),
在myPet对象的列表中不难看出,这些属性和方法之间都是用逗号","分隔开来的。属性很好理解,而方法的创建则是由一个匿名function标记的。
在该对象被创建以后并且以myPet变量声明了以后我们就可以这样使用了:
alert('my pet is ' + myPet.color);
alert('my pet has ' + myPet.legCount + ' legs');
//if you are a dog, bark three times:
myPet.communicate(3);
大家可以看到,JSON可以漂亮地应用到javascript中任何一个地方,作为function参数、返回值、服务器响应...
你理解了吗?function同样也是一个对象。
---------------------------------------------------------------
或许JS程序员中有些人从来就不这么认为,但是function确实也是一个Object。下面我们可以做个实验来验证一下,将你的function给你的另一个function做为参数传递,就传一个String一样。
var myDog = {
bark: function(){
alert('Woof!');
}
};
var myCat = {
meow: function(){
alert('I am a lazy cat. I will not meow for you.');
}
};
function annoyThePet(petFunction){
//let's see what the pet can do
petFunction();
}
//annoy the dog:
annoyThePet(myDog.bark);
//annoy the cat:
annoyThePet(myCat.meow);
在这里我们传递了myDog.bark和myCat.meow给annoyThePet。注意它们后面都没有带括号"()",如果不这样做的话我们传递的将不是"方法",而是该方法的返回值(在此例中为"Undefine")。
如果你想我的懒猫学狗狗叫,你可以这样做:
myCat.meow = myDog.bark;
myCat.meow(); //alerts 'Woof!'
Arrays, items 和对象成员object members
请看下面2行
var a = new Array();
var b = [];
你可以在array中添加items:
var a = ['first', 'second', 'third'];
var v1 = a[0];
var v2 = a[1];
var v3 = a[2];
但是你在声明时对索引不做数量限制,你将可以通过它的名字访问这个JS对象中的任何成员,就象这样,创建一个空的对象,然后就可以不停地添加了:
var obj = {}; //new, empty object
obj['member_1'] = 'this is the member value';
obj['flag_2'] = false;
obj['some_function'] = function(){ /**//* do something */};
等价于:
var obj = {
member_1:'this is the member value',
flag_2: false,
some_function: function(){ /**//* do something */}
};
在JS中,对象和关系型数组(hashes)两个概念通常是没有区别,下面的这两行代码是等价的:
obj.some_function();
obj['some_function']();
等了这么久,我可以拥有自己的Class了么?
OO的强大力量来自于类Class。当然了我们的JavaScript同样也可以做到这一点,请看吧:
//defining a new class called Pet
var Pet = function(petName, age){
this.name = petName;
this.age = age;
};
//let's create an object of the Pet class
var famousDog = new Pet('Santa\'s Little Helper', 15);
alert('This pet is called ' + famousDog.name);
但是我们如何能够将方法加到我们的Pet Class中来呢。我们可以为我们所有的类定义一个prototype属性。prototype属性其实也是一个对象,它包含一个类所拥有的一切其他对象。甚至默认JS类(Date,String,Number)也可以拥有prototype对象,使得各种新的方法和属性能扩充其中,让基础类获得更多的特性。
Pet.prototype.communicate = function(){
alert('I do not know what I should say, but my name is ' + this.name);
};
别忘了,我们得先导入 prototype.js才行。
ps: 个人认为象下面创建类,可能更简洁一点。
var Pet = Class.create();
Pet.prototype = {
//our 'constructor'
initialize: function(petName, age){
this.name = petName;
this.age = age;
},
communicate: function(){
alert('I do not know what I should say, but my name is ' + this.name);
}
};
将方法做为参数
如果你没有使用过支持closure的语言,象Ruby,C#,你会发现象这样的语法真是太有趣了:
var myArray = ['first', 'second', 'third'];
myArray.each( function(item, index){
alert('The item in the position #' + index + ' is:' + item);
});
未完带续.........