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

推荐订阅源

MyScale Blog
MyScale Blog
博客园 - 司徒正美
A
About on SuperTechFans
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
爱范儿
爱范儿
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
F
Fortinet All Blogs
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
D
Docker
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Jina AI
Jina AI
H
Help Net Security
量子位
IT之家
IT之家

博客园 - 想那风霜雪

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

    1)实现类的公有成员.
    前面定义的任何类成员都属于公有成员的范畴,该类的任何实例都对外公开这些属性和方法.
   
    2)实现类的私有成员.
    私有成员,即只在类的内部实现中可以共享访问的成员,不对外公开.
    JavaScript并没有提供特殊的机制来定义私有成员,但可以用一些技巧来实现这个功能.
    这个技巧主要是通过变量的作用域来实现的.在JavaScript中,一个函数内部定义的变量称为局部变量,该变量不能被函数外的程序所访问,却可以被函数内部定义的嵌套函数所访问.在实现私有成员的过程中,正利用了这一性质.
    在类的构造函数中可以为类添加成员,通过这种方式定义的类成员,实际上共享了在构造函数内部定义的局部变量,这些变量就可以看作类的私有成员,因为它符合了私有成员的定义(内部可访问,外部不可访问.)
    如下:

function class1(){
    
var pp = "this is a private property."//私有属性成员pp
    function pm(){      //私有方法
        alert(pp);
    }
    
this.method1 = function(){
        
//在公有成员方法中改变私有属性的值.
        pp="pp has been changed";
    }
    
this.method2 = function(){
        
//在公有成员方法中调用私有方法
        pm();
    }
}
var obj1 = new class1();
obj1.method2(); 

obj1.method1(); 
obj1.method2(); 

    这里,就实现了私有属性pp和私有方法pm.
    实现原理:运行完class1之后,尽管看上去pp和pm这些局部变量应该随即消失,但实际上因为class1是通过new来运行的,它所属的对象还没消失,所以仍然可以通过公开成员来对它们进行操作.
    注意:这些局部变量(私有成员),被所有在构造函数中定义的公有方法所共享,而且仅被在构造函数中定义的公有方法所共享,这意味着,在prototype 中定义的类成员将不能访问在构造器函数中定义的局部变量(私有成员),这算是一点缺陷.
   
使用私有成员,是以牺牲代码可读性为代价的。而且这种实现更多的是一种JavaScript技巧,因为它并不是语言本身具有的机制。但这种利用变量作用域性质的技巧,却是值得借鉴的。
   
    3)实现静态成员
    静态成员属于一个类的成员,它可以通过"类名.静态成员名"的方式访问.
    在JavaScript中,可以给一个函数对象直接添加成员来实现静态成员,因为函数也是一个对象,所以对象的相关操作,对函数也同样适用.例如:

function class1(){//构造函数
}
//静态属性
class1.staticProperty="sample";
//静态方法
class1.staticMethod=function(){
      alert(class1.staticProperty);
}
//调用静态方法
class1.staticMethod();

    通过上面的代码,就为类class1添加了一个静态属性和静态方法,并且在静态方法中访问了该类的静态属性.
    如果要给每个函数对象都添加通用的静态方法,这就需要通过函数对象所定义的基类:Function来实现(同样,要为所有的对象添加方法,用Object来实现),例如:

//给类Function添加原型方法:show ArgsCount
Function.prototype.showArgsCount=function(){
      alert(
this.length);    //显示函数定义的形参的个数
}
function class1(a,b){
      
//定义一个类
}
//调用通过Function的prototype定义的类的静态方法showArgsCount
class1. showArgsCount ();

    可见,通过Function的prototype原型对象,可以给任何函数都加上通用的静态成员,这在实际开发中可以起到很大的作用,比如在著名的prototype.js框架中,就给所有的函数定义了以下两个方法:

//将函数作为一个对象的方法运行
Function.prototype.bind = function(object) {
  
var __method = this;
  
return function() {
     __method.apply(object, arguments);
  }
}
//将函数作为事件监听器
Function.prototype.bindAsEventListener = function(object) {
  
var __method = this;
  
return function(event) {
    __method.call(object, event 
|| window.event);
  }
}