公共成员
任何函数可以访问,修改,添加或删除这些成员.主要有两种途径:
构造函数
通常是用来初始化对象属性,使用this在构造函数内设置.
因为使用this初始化的对象属性可以使用hasOwnProperty("member")判断该属性是否存在,迭代出属性的所有对象.原型中设置的属性用hasOwnProperty是获取不到的.
function Container(param){ this.member = param }
原型
通常是用来添加公共方法.
Container.prototype.stamp = function (string) { return this.member + string; }
私有
属性和方法
构造函数里定义的function,即为私有方法;而在构造函数里用var声明的变量,也相当于是私有变量。
var Person = function(name,sex){ this.name = name; this.sex = sex; var _privateVariable = "";//私有变量 //构造器中定义的方法,即为私有方法 function privateMethod(){ _privateVariable = "private value"; alert("私有方法被调用!私有成员值:" + _privateVariable); } privateMethod(); //构造器内部可以调用私有方法 } Person.prototype.sayHello = function(){ alert("姓名:" + this.name + ",性别:" + this.sex); } var p = new Person("菩提树下的杨过","男"); p.sayHello(); //p.privateMethod();//这里将报错,私成方法无法被实例调用 alert(p._privateVariable);//显示: undefined
特权
使用一种特权的方法使外部能够访问私有变量和方法.set和get往往用于设置和读取私有变量
var Person = function(){ var salary = 0.0; this.setSalary = function(value){ salary = value; } this.getSalary = function(){ return salary; } } var p = new Person(); p.setSalary(1000); alert(p.getSalary());//返回1000 alert(p.salary);//返回undefined
静态
静态类
首先来明确下静态类的定义: 不能被实例化,仅包含静态成员,不包含实例构造函数,无需创建实例,用类名就能直接访问其成员。
StaticClass = { a1: 1, a2: 2, f1 : function(){}, f2 : function(){} }
由于StaticClass不包含构造函数,所以不能用new来实例化。 它其实就是一个全局对象。
一般可以使用即时函数创建一个静态类,这样可以保存一些局部变量,和私有函数,并能做一些预处理。
re = function(){ var t1 = 1; var t2 = 2; function f1(){}; function f2(){}; var re = { a1: xxx, a2: xxx, fn1:function(){}, fn2:function(){} } return re; }()
静态属性和方法
所谓的静态,不能由实例调用,只能用类名调用
function Person(name) { //非静态属性 this.name = name; //非静态方法 this.show = function() { alert(‘My name is ‘ + this.name + ‘.’); } } //添加静态属性,人都是一张嘴 Person.mouth = 1; //添加静态方法,哇哇大哭 Person.cry = function() { alert(‘Wa wa wa …’); }; //使用prototype关键字添加非静态属性,每个人的牙可能不一样多 Person.prototype.teeth = 32; //非静态方法必须通过类的实例来访问 var me = new Person(‘Zhangsan’); //使用非静态方法、属性 me.show(); alert(‘I have ‘ + me.teeth + ‘ teeth.’); //使用静态方法、属性 Person.cry(); alert(‘I have ‘ + Person.mouth + ‘ mouth.’);