javascript屬性詳解


    在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來定義對象的屬性。這些是很強大的方法,下次再介紹。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM