JavaScript的public、private和privileged模式

JavaScript的public、private和privileged模式

原文:[url=http://javascript.crockford.com/private.html]Private Members in JavaScript[/url]

JavaScript是世界上最被误解的编程语言。有人认为它缺少信息隐藏的特性,因为JavaScript对象不能拥有私有变量的方法。
但是这是个误解。JavaScript对象可以拥有私有成员。

[color=blue][b]对象[/b][/color]
JavaScript从根本上就是关于对象的。数组是对象,方法是对象,Object也是对象。什么是对象?对象就是键值对的集合。键是字符串,
值可以是字符串,数字,布尔和对象(包括数组和方法)。对象通常被实现为Hashtable,这样值就可以被快速获取。

如果值是一个函数,我可以称其为方法。当对象的方法被调用时,“this”变量则被赋予该对象。方法可以通过“this”变量访问实例
变量。

对象可以由初始化对象的方法 -- 构造函数产生。构造函数提供在其他编程语言中类提供的特性,包括静态变量和方法。

[color=blue][b]Public[/b][/color]
对象的成员都是public成员。任何对象都可以访问,修改,删除这些成员或添加新成员。主要有两种方式来在一个新对象里放置成员:

[b]在构造函数里[/b]
这种技术通常用来初始化public实例变量。构造函数的“this”变量用来给对象添加成员。
[code]
functin Container(param) {
this.member = param;
}
[/code]
这样,如果我们构造一个新对象var myContainer = new Container('abc'),则myContainer.member为'abc'。

[b]在prototype里[/b]
这种技术通常用来添加public方法。当寻找一个成员并且它不在对象本身里时,则从对象的构造函数的prototype成员里找。
prototype机制用来做继承。为了添加一个方法到构造函数创建的所有对象里,只需添加到构造函数的prototype:
[code]
Container.prototype.stamp = function (string) {
return this.member + string;
}
[/code]
这样,我们可以调用该方法myContainer.stamp('def'),结果为'abcdef'。

[color=blue][b]Private[/b][/color]
private成员由构造函数产生。普通的var变量和构造函数的参数都称为private成员。
[code]
function Container(param) {
this.member = param;
var secret = 3;
var that = this;
}
[/code]
该构造函数创建了3个private实例变量: param,secret和that。它们被添加到对象中,但是不能被外部访问,也不能被该对象自己的
public方法访问。它们只能由private方法访问。private方法是构造函数的内部方法。
[code]
function Container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var that = this;
}
[/code]
private方法dec检查secret实例变量。如果它大于0,则减少secret并返回true,否则返回false。它可以用来让这个对象限制用3次。
按照惯例,我们定义一个private的that变量。这用来让private方法可以使用本对象。这样做是因为ECMAScript语言规范有一个错误,
该错误导致不能正确的设置this给内部方法。

private方法不能被public方法调用。为了让private方法有用,我们需要引入privileged方法。

[color=blue][b]Privileged[/b][/color]
privileged方法可以访问private变量和方法,并且它本身可以被public方法和外界访问。可以删除或替代privileged方法,但是不能
更改它或强制它泄露自己的秘密。

privileged方法在构造函数里用this分配。
[code]
function Container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var that = this;
this.service = function() {
if (dec()) {
return that.member;
} else {
return null;
}
};
}
[/code]
service是privileged方法。前三次调用myContainer.service()将返回'abc'。之后,它将返回null。service调用private的dec方法,
dec方法访问private的secret变量。service对其他对象和方法可见,但是它不允许直接访问private变量。

[color=blue][b]闭包[/b][/color]
由于JavaScript有闭包,public,private和privileged成员的模式是可行的。这意味着一个内部方法始终可以访问它的外部方法的
var变量和参数,甚至在外部方法返回之后。这是JavaScript语言的一个非常强大的特性。当前没有展示如何发掘这种特性的JavaScript
编程书籍,大多数甚至都没提到。

private和privileged成员只能在对象被构造时产生。public成员则可以在任何时候添加。

[color=blue][b]模式[/b][/color]

[b]public[/b]
[code]
function Constructor(...) {
this.membername = value;
}
Constructor.prototype.membername = value;
[/code]

[b]Private[/b]
[code]
function Constructor(...) {
var that = this;
var membername = value;
function membername(...) {...}
}
// 注意: function语句
// function membername(...) {...}
// 是如下代码的简写
// var membername = function membername(...) {...};
[/code]

[b]Privileged[/b]
[code]
function Constructor(...) {
this.membername = function (...) {...};
}
[/code]

译者注:我认为可以简单的把privileged方法简单的看成是构造函数里的public方法,因为privileged方法可以被外界和public方法访问,
而它自身又可以访问private变量。
js.private:对象的私有属性 安装 npm install js.private --save 用法 import Private from "js.private" ; class People { constructor ( firstname , lastname , gender , city , street ) { $ ( this ) . firstname = firstname ; // private property $ ( this ) . lastname = lastname ; // private property $ ( this ) . address . country = country ; // private property $ ( this ) . address . city = ci 立即下载

相关推荐

JS中的public和private对象,即static修饰符

先看下面的例子,它将告诉我们在JS世界中也有C#里的public , private ,及static等

javascript中类的public,protected,private详解

类???????? START???????? 01 - PUBLIC???????? 02 - PROTECTED???????? 03 - PRIVATEHAPPY???????????? ???????? START 在我们 javascript ES5 之前要想进行继承,封装,多态性,得使用到我们的原型,原型链来使用面向对象的过程,但是 ES6 之后新增了一个 class 语法,可以看做是 “语法糖”,实质还是运用了 ES5 的原型,和原型链进行实现的。 ???????? 01 - PUBLIC

weixin_54345600的博客 5011

机器学习 -- 信用卡评分模型 -- 互联网金融风控

互联网金融主要分为资金类和资产类。资金类主要是理财产品,吸储,主要指标是用户转化、留存和复投,重在客户运营。资产类主要是贷款,包括消费金融和现金贷,小额贷款属于此类,主要目的是用户转化,还款和风险控制,信用卡评分模型就属于风险控制。 信用评分作用是对贷款申请人(信用卡申请人)做风险评估分值的方法。 信用卡评分是以大量数据的统计结果为基础,根据客户提供的资料和历史数据对客户的信用进行评估,评分卡模型...

XiaoMaEr66的博客 2419

JS public、private、protected 有什么区别呢?

访问修饰符访问范围Public任何地方(内部、外部、子类)Private仅在类内部, 可以通过公共方法访问Protected仅在类内部和派生类内部在 JavaScript 中,public和private是直接支持的,而protected采用约定形式实现,通常依赖于命名约定。使用这些访问修饰符可以帮助更好地封装代码、隐藏实现细节以及提高数据安全性。

nemoiu的博客 1046

在运行opencv时出现的两个问题:AttributeError: module ‘cv2‘ has no attribute ‘gapi_wip_gst_GStreamerPipeline‘

解决了opencv的两个问题:由问题一引出 AttributeError: module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline' cv2.error:OpenCV(4.1.2)C:\projects\opencvpython\opencv\modules\highgui\src\window.cpp:717:error: (-2:Unspecified error) The function is not implemented...

hu_yinghui的博客 3274

波束成形(Beamforming)详解

波束成形(Beamforming)是一种智能天线技术,通过调整天线阵列的相位和幅度,使信号在特定方向上增强,同时抑制干扰,提高通信性能。根据实现方式,可分为固定波束成形和自适应波束成形;按计算方式,则包括模拟、数字和混合波束成形。该技术在 5G/6G、毫米波通信、MIMO、车联网、卫星通信 等领域广泛应用。其关键技术包括 相控阵、预编码、波束扫描和波束跟踪。未来,结合 AI、超大规模 MIMO(XL-MIMO)和太赫兹通信,波束成形将在无线通信、智能交通、环境感知等领域发挥核心作用。

斯黄人民的博客 2383

JavaScript实现类的private、protected、public、static以及继承

JavaScript实际上是一种弱类型语言,与C++和Java等语言不同。因此,在JavaScript中,没有强调类(class)这一概念,但实际运用中,类还是很重要的,比如写一款游戏,如果我们不停地调用函数来完成创建角色,移动角色的话,那会是什么样的呢?可能会出现非常多的重复代码,因此我们需要一个类来统一这些代码。所谓的类,就是把程序中的代码分类,比如说游戏中的关于角色的代码算作一类,游戏背景算作一类,游戏特效又是

Yorhom's Game Box 2万+

Android真机调试——ADB调试(含华为手机无法找到设备)

本文以Huawei Nova7为例。

lianqi2003的博客 7856

js: public、private、protected 定义和区别

js: public、private、protected 定义和区别

weixin_44384273的博客 825

Yolov5s可视化网络结构图

Yolov5共有四种网络结构,每种网络深度和宽度上都不相同。 (1) Yolov5s可视化网络结构图:点击查看 (2) Yolov5m可视化网络结构图:点击查看 (3) Yolov5l可视化网络结构图:点击查看 (4) Yolov5x可视化网络结构图:点击查看 ...

江南研习社 15万+

基于大模型的重度膝关节骨关节炎全流程预测与治疗方案研究

本研究基于大模型构建了重度膝关节骨关节炎(KOA)预测体系,涵盖术前风险预测、手术方案优化、术中监测和术后康复指导全流程。通过分析临床和影像数据,模型在手术风险预测准确率(85%)、并发症预警(血栓预测准确率88%)等方面显著优于传统方法。研究实现了临床数据与AI技术的深度融合,术前预测指导麻醉选择(如高危患者推荐椎管内麻醉),术中实时监测生命体征,术后个性化康复方案使患者HSS评分平均提升45分。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1389

SSH项目--国税(五)

8信息发布管理 8.1实现信息发布管理CRUD 8.1.1编写信息实体映射文件 编写信息实体类Info 及其映射文件 Info.hbm.xml 设置“信息分类”、“状态”的常量信息,其中信息分类需要设置一个静态MAP包括信息分类用于在页面的显示。 8.1.2实现信息发布管理 1、编写InfoDao/InfoDaoInfo 2、编写InfoService/InfoServiceImp

花开不合阳春暮 674

YOLOv8 交通管理三大核心功能 —— 二、违章检测系统 详细解释及代码完整示例

YOLOv8交通违章检测系统

u010117029的博客 500

js.公开Public、私有Private、特权的Privileged?

  //定义一个匿名函数o,此o为return的对象 var o = function() {     //私有变量--外界访问不了     var para3 = 3;    //私有函数--外界访问不了     var privateHandler = function(){        alert(para3);    };   

1005

流程图详解Transformer最核心的多头注意力机制,QKV流向清晰明了

本文详细讲解了Transformer模型中的多头注意力机制(Multi-head Attention)。通过类比多人评估同一事物的不同视角,说明多头机制能综合多个注意力权重获得更有效的输出。文章逐步推导了多头注意力的计算过程:将输入矩阵X(4×512维)分别与8组Q、K、V权重矩阵相乘,得到8组head(每组4×64维),拼接后经Wo矩阵变换恢复为4×512维输出。整个过程涉及37个待训练参数矩阵(1个Wo、8组Wq/Wk/Wv)。该机制通过并行计算多个注意力头,能更全面捕捉输入特征间的复杂关系。

人工智能研究所的博客 254

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

public privileged private -- method varible

<script> //class function for defining instances of a closure demo function ClosureDemo2() {  var _a = 0, _b = 0;     //private properties prefixed with an underscore to denote that they        ...

Create, don't just consume! 112

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JavaScript:如何获得 Private、Privileged、Public 和 Static 成员(属性和方法)【翻译+整理】...

本文内容 背景 把我们的对象放在一起 添加一个私有(Private)的属性 添加一个特权(Privileged)的方法 添加一个公共(Public)的属性和方法 添加一个静态(Static)的属性 我们自己的完整对象 创建一个实例对象并检查可访问性 结论 ...

weixin_30925411的博客 96

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OOP in JS Public/Private Variables and Methods

Summary private variablesare declared with the 'var' keyword inside the object, and can only be accessed by private functions and privileged methods. private functionsare declared inline ins...

weixin_30604651的博客 121

OOP in JS, Part 1 : Public/Private Variables and Methods

Summary private variables are declared with the var keyword inside the object, and can only be accessed by private functions and privileged methods. private functions are declared inlin

goody9807的专栏 691

pro js读书笔记1

1首先我们来看一下js中的public method: [code]// 创建一个User的构造函数 function User( name, age ){ this.name = name; this.age = age; } // 加一个新的函数getName到User的prototype. User.prototype.getName = functio...

但行好事 莫问前程 188

JS中关于作用域问题的实验

// JavaScript Document function className() { //public属性 this.publicVar = "This is a public var."; //private属性 var privateVar = "This is a private var."; var instanceObj = this; //很关键,直

299
上一篇: Java代码规范
下一篇: 初识Perl/Catalyst
hidetobj
博客等级 码龄19年 16粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值