1 var myConstructor = function(message){ 2 //实例变量 3 this.message = message; 4 5 //私有变量,外部不可见。用var声明的变量具有块作用域 6 var separator = '-'; 7 var owner = this; 8 9 //私有方法:只能在构造器内调用 10 function alertMessage(){ 11 alert(owner.message); 12 //alert(this.message);则下面concatMessage()方法会显示undefined 13 } 14 15 //与前面一样是私有方法 16 //注意:这种做法在脚本执行到该赋值语句之前 alertMessage()函数是不存在的。 17 //如果在该定义发生之前调用alertMessage()将会出错。 18 //var alertMessage =function (){ 19 // alert(owner.message); 20 //} 21 22 //特权方法(也是公有方法)。可访问内部私有变量,也能被外部调用 23 this.concatMessage = function(string){ 24 this.message += separator + string; 25 alertMessage(); 26 } 27 } 28 29 //公有方法,但不是特权方法,不能访问separator变量。出错:separator is undefined 30 //去掉separator后可以正常工作 31 //myConstructor.prototype.concatMessage = function(string){ 32 // this.message += separator + string; 33 // alert(this.message); 34 //} 35 36 var two = new myConstructor('a'); 37 //私有方法,外部不能调用 38 //two.alertMessage(); 39 two.concatMessage('b');
注意:
1.由于私有和特权成员在函数的内部,因此在创建实例时,每个实例都会包含同样的私有和特权成员副本。所以实例越多,占用的内存也就越多。