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来定义对象的属性。这些是很强大的方法,下次再介绍。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。