在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