JavaScript成長記(1)

來源:互聯網
上載者:User

對javascript的一些瞭解。下面都是讀書筆記。
1.先說下function
function square(x){return x*x;}
這個定義將會建立一個新的function對象並且把它分配到一個square變數中去。square不是function的實質。它只是一個引用function的變數的名稱.而這個function還可以分配給其它變數。
var a=square(4);
var b=square;
var c=b(5);

每一個Function都有一個length屬性,它表示的是function本身申明的參數個數。與function隱含的arguments.length不同的是,argument.length是被調用時實際傳遞過來的參數個數。
每一個function都有一個prototype屬性,它引用的是預先定義個prototype對象。當function作為構造器被new操作符使用時。prototype指向的是構造器。
當一個function被定義時,當前的範圍鏈(scope chain)就被儲存為function的內部狀態了。
當指令碼解譯器調用一個function時,首先會在範圍鏈中設定function的範圍。接著,會把這個對象設定在範圍鏈的最前面。然後用arguments所引用的Argument對象來初始化這個對象。被命名的
參數會被添加到緊挨著這個對象的下面。任何在function中申明的變數都在這個對象內。既然局部變數、function參數、和Argument對象都在function中。那麼就意味著會有相同名稱的屬性。
需要注意的是arguments,this不是對象的屬性,所以你就不能在一對象中訪問他們,我想這個是實現私人成員的前提。
//function mutil(w,h)
//{
//    this.getWidth=function(){return w;};
//    this.getHeight=function(){return h;};
//}
//var m=new mutil(2,3);
//alert(m.getWidth());
//m.getWidth=function(){return mutil.arguments[0]=1;}//如果能訪問arguments屬性,那就能改變參數的值。在javascript中實現私人也就是不可能了。
//alert(m.getWidth());
當程式需要匯入許多不同的js代碼時,Namespace事實上是非常有用的,當使用一個已定義的function建立一個對象時,所定義的變數和建立的屬性是放在一個臨時的Namespace中。它不會破壞全域的Namespace。
當一個function被調用時,一個調用對象(call object)也就被建立了,並且被放到範圍鏈中,當function執行完時,調用對象也會從範圍鏈上移除不在引用它了,調用對象也就被垃圾收集掉。
JavaScript中的function是被執行代碼的組合和執行時的範圍。代碼的組合和範圍通常被成為閉包。所有的functions都是閉包。
function的建立有兩種,一是Function()構造器,另一種是function文本。
var f=new Function("x","y","return x*y");這種最後一個參數就是function body.
function f(x,y){return x*y;} 這種是通常的做法。
非常值得注意的是Function()構造器它建立使用的是全域範圍。
var y='global';
function ctor()
{
 y='local';
 return new Function("return y;");
}
alert(ctor()())://這裡輸出的是global;

2.說下prototype.

用new建立對象時,它會設定對象的prototype。對象的prototype是對象的構造器function的prototype屬性的值。所有的function有有一個prototype屬性,當定義function時它被自動建立並初始化。
prototype屬性的初始值是一個擁有單個屬性的對象,這個對象有一個名為constructor的屬性並引用這function的構造器。可以添加任意的屬性到prototype上,它將會被構造器初始化。
一個構造器提供了對象的"類"的一個名稱並且負責初始化。繼承是自動發生的當尋找一個屬性的值。屬性並沒有從prototype對象拷貝到新對象中;它僅僅看起來是這些對象的屬性。
兩點非常重要:一使用prototype可以減少每一個對象對記憶體的需求。二即使對象被建立後才屬性被prototype中,對象仍然繼承了這些屬性。繼承的屬性和對象的普通屬性很相似,它們是可枚舉的。
每一個類(function)都有一個prototype對象,但是有許多隱含的類的執行個體,每一個都繼承了類的prototype屬性。因為一個prototype屬性被許多個物件共用,所以在javascript中讀取屬性值和寫入屬性值
存在著不對稱。當要訪問一個對象的一個屬性比如obj.pp。javascript首先會在對象obj中尋找是否有名稱為pp的屬性,如果沒有就去尋找對象ob中的prototype對象中是否有名稱為pp的屬性,這就是prototype
繼承的基本工作原理。當你寫入一個屬性值時,javascript不會去使用prototype對象。因此屬性的繼承僅僅是發生在你讀取屬性值的時候。當你設定屬性pp的值時,事實上是建立了一個新的屬性pp
這時對象obj有了自己屬性pp,它就不在從prototype中繼承pp的值了。當再次訪問obj.pp是,使用的是對象obj自己的屬性pp。
擴充內建類型。任何通過prototype添加到內建類型中的屬性和方法,都是可枚舉的,而且對每一個該類型的單個對象都是可見的。一個Null 物件比如:{}.本來它是沒有可枚舉屬性的。但是任何添加
到Object.prototype的屬性方法,這個Null 物件也會有。這種擴充只能對javascript本身的內建對象,而不能對宿主對象進行擴充。因為這些宿主對象沒有構造器和prototype對象。

3.JavaScript中的“類”。

儘管javascript支援被調用對象的資料類型。但是它是沒有正真意義上類的概念的。物件導向的語言是強型別的並且支援類的繼承。javascript中使用了大量的對象,它通過prototype繼承使得它
有自己的類型。從這個方面來說javascript使用prototype繼承替代了類的繼承,javascript又是一種物件導向的語言。儘管它不是類繼承的物件導向的語言,但是也能很好地類比了類繼承的特性。
一個對象是一種資料結構,它包含了許多不同名稱的資料和操作這些資料的許多方法,javascript中有對象許多屬性,它們可能是動態添加到對象上去的,這與強型別的語言不同,強型別的語言
每個對象的屬性是被預先定義好的。而且屬性的類型也被預先定義好。
function Circle(radius)
{
    this.r=radius;//執行個體屬性
}
Circle.prototype.area=function(){return Math.PI*this.r*this.r;}//執行個體方法
Circle.PI=Math.PI;//類屬性
Circle.max=function(a,b){return Math.max(a,b);}//類方法

var c=new Circle(3);
alert(c.r);
alert(c.area());
//alert(Circle.area());//不能訪問執行個體方法。此時會拋出異常。
alert(Circle.r);//不能訪問執行個體屬性,但是不會拋出異常,因為此時會在尋找Circle類屬性中是否有r屬性,沒有值為undefined.

4.valueOf方法。

valueOf()方法很像toString()方法,許多個物件都不是一個簡單的值。Number,Boolean很明顯是一個簡單的值所以它們重寫了
toString()方法類返回一個簡單的值。有一點要注意:在某些情況下,valueOf()方法比toString()方法有更高的優先權。所以有時就需要顯示的調用toString()方法。
當使用比較操作符是比如:<,>=時,這個對象不是Number,Boolean類型的對象,會調用該對象的valueOf()方法的傳回值來比較。
Object.toString=function(){return 6;};
Object.prototype.toString=function(){return 5;};
Number.prototype.valueOf=function(){return 2;};
Number.prototype.toString=function(){return 4;};
var a=new Number();
//a=3;//注意這裡a=3被注釋的話,a就是一個對象,它的類型是object的,但是它是Number類的執行個體。
alert(typeof a);//為object
alert(a instanceof Number);//為true;
alert(a.toString());//因為a是Number的執行個體,它調用的是Number的執行個體方法,所以它輸出的是4;
alert(a==2);//這裡調用的是valueOf()執行個體方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.