原文 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);
});

未完帶續.........