在js中,沒有公共屬性和私有屬性之分,只有全局變量(全局屬性)和局部變量以及對象屬性。可是,程序員能夠經過必定的技巧來實現面嚮對象語言的功能。下面咱們來介紹這幾種屬性(變量)java
全局變量也叫全局屬性程序員
/* 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 }
靜態屬性this
/*在java中,經過【類名.屬性】調用的方式,成爲靜態屬性,也叫類屬性。固然也能夠 經過實例來調用,可是編譯器會發出警告。在js中,咱們把一個函數叫作一個類。這個函 數名第一個字母一般大寫(大寫非必須)*/ function Person(){ } //靜態屬性 Person.a = 'ws'; //可是這個屬性不能夠經過實例調用 var p = new Person(); p.a; // undefined
私有屬性spa
/*在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來定義對象的屬性。這些是很強大的方法,下次再介紹。code