javascript屬性詳解

    在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

相關文章
相關標籤/搜索