javascript:JavaScript 私有成员分析

对象
JavaScript操作都是有关对象(Array)是对象(Function)是对象Object(类型)是对象那么什么是对象呢?对象就是“名称-值”对(name-value)名称是值可以是串、数值、布尔值或对象(包括)对象经常用哈希表实现所以取值速度很快
如果对象个值是(function)我们可以认为它是成员当成员this变量就会指向该对象成员可以通过this变量访问对象成员
对象可以通过构造器(constructor)生成构造器是个化对象构造器在这里扮演了其他语言中“类”扮演角色也提供了定义变量和思路方法手段
Public成员
对象所有成员都是公开成员谁都可以读写甚至删除这些成员或添加新成员添加新成员有两种思路方法:
在构造器里添加
这通常被用来化公开成员变量利用构造器this变量来把成员添加到对象里
function Container(param)
{ this.member = param;}
用下面这行代码生成个对象例子
var myContainer = Container('abc');
myContainermember成员值为'abc'
在原型中添加
这种思路方法经常用来添加公开成员当Javascrīpt解释器遇到个对象成员发现对象自身中并不存在这个成员时就会到对象构造 原型中去找原型机制可以用来实现继承它同样占用内存如果想要给某个构造生成所有对象都添加个方 法只要给对象原型添加这个思路方法就可以了
Container.prototype.stamp = function () { this.member + ;}
这样就可以这个成员
myContainer.stamp('def')
返回值'abcdef'
私有成员
私有成员是在构造器里产生var定义变量和构造器参数会成为私有成员
function Container(param){
this.member = param;
var secret = 3;
var that = this;
}
这个构造器定义了 3个私有变量:param,secret和self它们属性对象Container而对象外代码或是对象公开思路方法都无法访问它们
只有私有思路方法可以访问私有思路方法是构造器内定义
function Container(param){
function dec {
(secret > 0)
{ secret -= 1; true; }
{
false;
} }
this.member = param;
var secret = 3;
var that = this;}
私有思路方法 dec 检查例子变量 secret 如果它大于0就减少它值然后返回true;否则它返回false
它可以用于限制这个对象只能被使用3次
根据协议我们定义了个私有变量that用来让私有思路方法可以访问对象本身
这是个变通解决方案需要它根本原因在于ECMAscrīpt语言规范标准而这个导致内部this变量有
(honker:似乎不用that也没关系也许是原文写得太早了哪位高人遇到过这种问题?)
私有思路方法不能被公开思路方法为了让私有有用我们需要引入特权思路方法概念
特权
特权思路方法可以访问私有变量和思路方法并且它本身可以被公开思路方法和外部访问可以删除或替换个特权思路方法但是不能改变它或强迫它放弃自己秘密
特权思路方法是在构造通过this定义
function Container(param) {
function dec {
(secret > 0) {
secret -= 1;
true;
} {
false;
} }
this.member = param;
var secret = 3;
var that = this;
this.service = function {
(dec) {
that.member;
} {
null;
} };}
service是个特权思路方法前 3次myContainer.service将返回'abc'的后它将返回nullservice私有dec思路方法dec思路方法访问私有secret变量service对其他对象和都是可见但我们不能直接访问private成员
闭包
有了闭包这些公开、私有和特权思路方法写法才成为可能它意味着内部总能访问它外层定义变量和参数即使外层已经返回这是Javascrīpt个极其强大特性目前还没有如何本Javascrīpt编程书讲到如何利用它大多都没有提到它
私有和特权成员只能在对象被构造时生成公开成员可以在任何时间添加
写法
Public
function Constructor(...) {
this.membername = value;
}
Constructor.prototype.membername = value;
Private
function Constructor(...) {
var that = this;
var membername = value;
function membername(...) {...}
}
Note: The function statement
function membername(...) {...}
is hand for
var membername = function membername(...) {...};
Privileged
function Constructor(...) {
this.membername = function (...) {...};
}


Tags:  javascriptsplit javascript数组 javascript教程 javascript

延伸阅读

最新评论

发表评论