在js中,沒有公共屬性和私有屬性之分,只有全局變量(全局屬性)和局部變量以及對象屬性。但是,程序員可以通過一定的技巧來實現面向對象語言的功能。下面我們來介紹這幾種屬性(變量)
全局變量也叫全局屬性
/* 1.通過var關鍵字聲明。這種聲明方式只能在全局作用域內,不能在函數塊內部*/ var a = ''; /*2.直接給未聲明的變量賦值,這種方式在任何情況都有效。不過,一般程序員都 應當極力避免這種情況。這種隱士的聲明一個全局屬性是很容易出錯的*/ a = ''; /*3.通過window對象,這種方式可以在任何地方使用。如果需要定義一個全局屬性, 我推薦使用這種。*/ window.a = 'wname' ; /*4.用this。前提是要保證this是指向window,不過這是一種在意外情況下才會發生 的。*/ function x(){ this.a ='aname';} x(); /*總結:以上4種情況可以分為兩大類。第一種和后面3種。第一類必須是在全局作用域類,
也是常用的方式;第二類可以不在全局作用域內聲明,除了第3種,其他都應該避免使用。
還有,第一類是不可以使用delete來刪除的,第二類則可以*/ var a = 'ss'; delete a // false window.a = '33' delete a // true;
局部變量
/*在js中,只有函數才產生作用域。所以局部變量是在函數內部聲明*/ function x(){ // a就是局部變量,從外部無法訪問和修改。 var a = 'ws'; // 但是我們可以返回這個局部變量給外部使用。 return a; } //很少情況下可以在外部修改局部變量。下面是一種 function foo(){ var o = {name: 'we'}; return function(){ return o; }; } var f= foo(); var obj = f(); obj.name = 'ws'; f(); // {name: 'ws'}.即當閉包返回一個對象時,這個對象在外部是可能被修改的
對象屬性
//1.先有對象后有屬性 var o = {} //可以通過以下方式給對象添加屬性 o.name ='名稱'; o['a'] = '另一個屬性' //屬性的值也可以是函數 o.method = function(){}; //2.對象和屬性同時存在 var o = { 'name': '名稱', 'a': '另一個屬性', 'method': function(){ } } //對於這種方式,屬性最好加上引號 //3.通過函數new一個對象 function(name){ this.name = name }
靜態屬性
/*在java中,通過【類名.屬性】調用的方式,成為靜態屬性,也叫類屬性。當然也可以 通過實例來調用,但是編譯器會發出警告。在js中,我們把一個函數叫做一個類。這個函 數名第一個字母通常大寫(大寫非必須)*/ function Person(){ } //靜態屬性 Person.a = 'ws'; //但是這個屬性不可以通過實例調用 var p = new Person(); p.a; // undefined
私有屬性
/*在js中,沒有私有的概念。但是,可以通過閉包(局部變量)來實現*/ function Person (){ var name = '起個名吧'; this.getName = function(){ return name; } this.setName = function(newName){ name = newName; } } var p = new Person(); p.getName(); p.setName('張飛'); p.getName(); //張飛 /*像這樣的,就只能通過getName、setName來讀取寫入屬性name,可以對 name寫入的值進行控制。但是,如果name是一個對象的話,外部代碼就可以修 改它的值了*/ // 當屬性方法返回的是一個對象 function Person(){ var info = {name: '未初始化'} this.getInfo = function(){ return info; } } var p = new Person(); var pInfo = p.getInfo();// { name="未初始化"} pInfo.age = 32; // 不小心修改了p對象的信息 p.getInfo(); // { name="未初始化", age=32}。對象被改變了。 /*針對這種情況,由於外部只是讀操作,所以,我們可以返回一個副本。這樣就不用 擔心內部對象被修改了*/ function Person(){ var info = {name: '未初始化'} this.getInfo = function(){ // 如果info有多個屬性,可以用for in循環遍歷 return {name: info.name}; } }
在最新的js規范中,還可以通過get、set和defineProperty、defineProperties來定義對象的屬性。這些是很強大的方法,下次再介紹。
