建立物件
首先我們先理解物件導向程式設計(Object-Oriented Programming,OOP),使用OOP技術,常常要使用許多程式碼模組,每個模組都提供特定的功能,每個模組都是孤立的,甚至與其它模組完全獨立。這種模組化程式設計方法提供了非常大的多樣性,大大增加了程式碼的重複使用機會。可以舉例進一步說明這個問 題,假定電腦上的一個高效能應用程式是一輛一流賽車。如果使用傳統的程式設計技巧,這輛賽車就是 一個單元。如果要改進該車,就必須替換整個單元,把它送回廠商,讓汽車專家升級它,或購買一個新 車。如果使用OOP技術,就只需從廠商處購買新的引擎,自己按照說明替換它,而不必用鋼鋸切割車體。 不過大部分的論點是,javascript並不是直接的物件導向的語言,但是透過模擬可以做到很多物件導向語言才能做到的事,如繼承,多型,封裝,javascript都能幹(沒有做不到,只是想不到)
//以下三种构造对象的方法 //new Object,实例化一个Object var a=new Object(); a.x=1,a.y=2; //对象直接量 var b={x:1,y:2}; //定义类型 function Point(x,y){ //类似于C#中的类 this.x=x; this.y=y; } var p=new Point(1,2); //实例化类
第一種方法是透過建構基本物件直接加入屬性的方法來實現,第二種和第一種差不多,可以看成是第一種方法的快速表示法第三種方法中,可以以」類別「為基礎,創造多個類型相同的物件
物件屬性的封裝(公有和私有)
以範例來說明
function List(){
var m_elements=[]; //私有成員,在物件外無法訪問,如果此處無var聲明,則m_elements將變成全域變量,這樣外部是可以直接存取到的,如alert (m_elements[0])
m_elements=Array.apply(m_elements,arguments); //此处模拟getter,使用时alist.length; //等价于getName()方式:this.length=function(){return m_elements.length;},使用时 alist.length(); //公有属性,可以通过"."运算符或下标来访问 this.length={ valueOf:function(){ return m_elements.length; }, toString:function(){ return m_elements.length; } } //公有方法,此方法使用得alert(alist)相当于alert(alist.toString()) this.toString=function(){ return m_elements.toString(); } //公有方法 this.add=function(){ m_elements.push.apply(m_elements,arguments); } //私有方法如下形式,这里涉及到了闭包的概念,接下来继续说明 //var add=function()或function add() //{ //m_elements.push.apply(m_elements,arguments); //} } var alist=new List(1,2,3); dwn(alist); //=alert(alist.toString()),输出1,2,3 dwn(alist.length); //输出3 alist.add(4,5,6); dwn(alist); //输出1,2,3,4,5,6 dwn(alist.length); //输出6
屬性與方法的型別
javascript裡,物件的屬性與方法支援4種不同的型別:private property(私有屬性),dynamic publicproperty(動態公有屬性),static public property/prototype property(靜態公有屬性或原型屬性),static property(靜態屬性或類別屬性)。私有屬性對外界完全不具備訪問性,可以透過內部的getter和setter(都是模擬);動態公有屬性外界可以訪問,每個物件實例持有一個副本,不會互相影響;原型屬性每個物件實例共享唯一副本;類別屬性不作為實例的屬性,只作為類別的屬性。
以下是範例:
//动态公有类型,静态公有类型(原型属性) function myClass(){ var p=100; //private property this.x=10; //dynamic public property } myClass.prototype.y=20; //static public property or prototype property,动态为myClass的原型添 加了属性,将作用于所有实例化了的对象,注意这里用到了prototype,这是一个非常有用的东东 //要想成为高级javascript阶段,prototype和闭包必须得理解和适当应用 myClass.z=30; //static property var a=new myClass(); dwn(a.p) //undefined dwn(a.x) //10 dwn(a.y) //20 a.x=20; a.y=40; dwn(a.x); //20 dwn(a.y); //40 delete(a.x); //删除对象a的属性x delete(a.y); //删除对象a的属性y dwn(a.x); //undefined dwn(a.y); //20 静态公有属性y被删除后还原为原型属性y dwn(a.z); //undefined 类属性无法通过对象访问 dwn(myClass.z);
以上是javascript建立物件、函數封裝、屬性程式碼實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!