惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
Y
Y Combinator Blog
T
Tailwind CSS Blog
D
Docker
博客园 - Franky
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Google DeepMind News
Google DeepMind News
腾讯CDC
Vercel News
Vercel News
Engineering at Meta
Engineering at Meta
U
Unit 42
The Cloudflare Blog
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
爱范儿
爱范儿
Recent Announcements
Recent Announcements
博客园 - 聂微东
博客园 - 叶小钗
H
Help Net Security
MyScale Blog
MyScale Blog

博客园 - 想那风霜雪

基于web的甘特图,易度甘特图edogantt! JavaScript异常处理 - 想那风霜雪 - 博客园 一个支持Drag页面拖动的组件 - 想那风霜雪 - 博客园 main Function和Object(2) Function和Object(1) - 想那风霜雪 - 博客园 Atlas系列:从AtlasRuntime.js开始-简介 Atlas源码阅读系列之一 9)使用面向对象思想处理cookie 8)事件设计模式 7)实现抽象类 6)类的继承 5)使用for(...in...)实现反射机制 4)公有成员\私有成员和静态成员 - 想那风霜雪 - 博客园 3)类的实现 2)深入认识JavaScript中的函数 1)JavaScript面向对象的基础 JavaScript的OO特性:Singleton单件模式 JavaScript的OO特性:继承
JavaScript的OO特性:私有访问限制实现
想那风霜雪 · 2006-08-11 · via 博客园 - 想那风霜雪

        一个类,总有一些内部的特殊实现细节,这些细节不宜被外部获知并访问,这就是OOP中的私有访问限制符的意义.JavaScript没有提供实现此机制的支持,但我们可以通过一些技巧来另行实现.
        在前面几节,我们定义的类的属性和方法,统一都是公开的,即通过类的实例对象都能访问到.
        让我们首先定义一个具有私有属性和方法的类吧,如下:

    //声明People类
    var People = function(name,isMan,age){
        
//设置私有成员:不用this索引器声明的对象就是私有的
        //私有方法
        function dec(){         //检查secret实例变量,限制对象使用三次.
            if (secret > 0){
                secret
--;
                
return true;
            }

            
else 
                
return false;
        }

        
//私有属性
        var secret = 3;
    
        
this.name = name || "none";         //string 
        this.sex = isMan || false;          //bool
        this.age = age || 0;                //int
    }

        这里发现,在People类的定义中,secret属性和dec()方法前都没有用this关键字声明,这就声明了"私有"的对象了.
        私有对象声明好之后,就需要通过公开的方法或属性简洁操纵,否则就没有意义了.
        下面通过一个公开方法toString,来简洁操纵实例的私有对象,如下:

    var People = function(name,isMan,age){
        
//设置私有成员:不用this索引器声明的对象就是私有的
        //私有方法
        function dec(){         //检查secret实例变量,限制对象使用三次.
            if (secret > 0){
                secret
--;
                
return true;
            }

            
else 
                
return false;
        }

        
//私有属性
        var secret = 3;
    
        
this.name = name || "none";         //string 
        this.sex = isMan || false;          //bool
        this.age = age || 0;                //int
        //定义在类内部的公开方法与在类外部的公开方法不同.
        //内部的能访问私有对象,而外部的则不能.        
        this.toString = function(){
            
if (dec()){
                
return this.name + "&" + this.sex + "&" + this.age + "&" + secret; //这里不能使用this索引器.
            }

            
else
                
return null;
        }
        
    }

//    People.prototype.show(){
//
        alert(this.secret);     //在类外部定义的公开方法,不能访问类的私有属性,将会运行出错.
//
    }

        呵呵,前面我们通过在类内部的this.toString = function(){...}和People.prototype.String = function(){...}来定义好象完全相同功能的toString方法.这里就显示出来区别了.
        在类内部通过this索引器定义的公开方法,能访问类内部的私有对象,而类外部通过prototype定义的公开方法则不能.
        下面是完整的示例代码:

<script type="text/javascript">
    
//声明People类
    var People = function(name,isMan,age){
        
//设置私有成员:不用this索引器声明的对象就是私有的
        //私有方法
        function dec(){         //检查secret实例变量,限制对象使用三次.
            if (secret > 0){
                secret
--;
                
return true;
            }

            
else 
                
return false;
        }

        
//私有属性
        var secret = 3;
    
        
this.name = name || "none";         //string 
        this.sex = isMan || false;          //bool
        this.age = age || 0;                //int
        //定义在类内部的公开方法与在类外部的公开方法不同.
        //内部的能访问私有对象,而外部的则不能.        
        this.toString = function(){
            
if (dec()){
                
return this.name + "&" + this.sex + "&" + this.age + "&" + secret; //这里不能使用this索引器.
            }

            
else
                
return null;
        }
        
    }

//    People.prototype.show(){
//
        alert(this.secret);     //在类外部定义的公开方法,不能访问类的私有属性,将会运行出错.
//
    }
    var p = new People("fanrong",true,24);
    alert(p.toString());
    alert(p.toString());
    alert(p.toString());
    alert(p.toString());        
//当访问第四遍时,由于p对象内部的私有变量secret<0,返回null.(即不允许访问了)
</script>