博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Private Members In JavaScript(javascript的私有成员)——翻译
阅读量:4208 次
发布时间:2019-05-26

本文共 2850 字,大约阅读时间需要 9 分钟。

翻译大半,发现有人翻译过了,而且翻译地还比较好。但是还是硬着头皮翻下去了,并参考他的做了修改,就作为我翻译e文的第一次吧。

原文:l

    javascript是全世界最被误解的语言。有些人觉得它缺少隐藏信息的机制,因为javascript的对象没有私有变量和方法。但这是种误解。javascript也有私有成员。让我们看看吧。

对象:

    javascript是基于对象的。数组(Arrays)是对象,函数(Functions)是对象,对象尼玛也是对象。什么是对象呢?对象是名-值的集合。名是字符串,值可以是字符串,数字,布尔型和对象(包括数组和函数)。通常对象会被实现为hashtables,这样数据就可以很快地获取。

     如果值是函数,我们可以把它当做一个方法。当方法被对象调用,这个变量会被赋予到这个对象。这个方法可以获取对象的变量。

     对象可以通过(constructors)构造函数创造,构造函数提供的功能包括静态变量和方法。

共有成员:

    对象中所有的方法都是共有的。任何函数都可以调用,修改或者删除,或者增加新的方法。这里有两种主要的方式来增加成员到一个新对象中:

利用构造函数:

这种技巧通常被用在初始化公共实体变量,构造函数的this变量被用来增加共有变量到对象中。

function Container(param) {    this.member = param;}
所以,如果我们构造一个对象 

var myContainer = new Container('abc');

那么 myContainer.member 包括 ’abc‘。

利用原型

这种技巧通常会被用到增加共有方法。当查到一个成员而在相应对象中没有找到时,就会去构造函数的portotype中寻找。原型的原理常被用来实现继承。它同时也节省内存。如果要添加一个方法到所有的对象实例中,可以通过在构造函数的原型中添加一个函数来实现:

Container.prototype.stamp = function (string) {    return this.member + string;}
然后,我们可以这样调用:myContainer.stamp('def')。

结果返回'abcedf'。

私有成员:

私有变量通过构造函数实现,普通的var变量和构造函数的参数将变成私有成员。

function Container(param) {    this.member = param;    var secret = 3;    var that = this;}
这个构造函数创建了3个参数:param,secret和that。它们都能被对象内部访问,但是无法从外面被访问。它们可以访问对象的共有方法,也可以被私有方法访问,私有方法是构造函数的内部函数。

function dec() {        if (secret > 0) {            secret -= 1;            return true;        } else {            return false;        }    }    this.member = param;    var secret = 3;    var that = this;}
私有方法dec检查实例变量secret。如果大于0,secret减去1,并返回true,否则返回false。这种方式可以用在限制这个对象的使用次数。按照惯例,我们定义一个私有的变量that。它被用于让对象对私有方法可见,这是ECMAScript语言规范的一个错误,引起this变量不能正确地对内部函数进行复制的一个解决方法。私有方法不能被共有方法返回。为了使私有方法更有用,我们需要一种方法:特权方法。

特权方法

特权方法可以访问私有变量和方法,对共有方法也是可见的。一个特许方法可能被删除或者替换,但是不可以修改它,除非完全被替换。

privileged 方法被分配给构造函数的this变量

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 () {        return dec() ? that.member : null;    };}

service是一个特许方法,前3次调用myContainer.service()会返回‘abc’,之后会返回null。service方法调用了私有方法dec,以便访问私有变量seret。service同样对其它对象和方法也是可见的,但是它不允许直接访问私有属性。

Closurs(闭包)

public,private和privileged等模式之所以存在,是因为javascript·拥有闭包属性。闭包在这里的意思是内部的函数可以调用外部的函数,即使外部函数已经返回了。这个是非常有用的一种特性。目前还没有书介绍如何利用 这个特性,有些甚至都没有提到。

私有成员和特权成员只有在对象构造的时候实现,公有成员可以在任何时候增加。

编写模式

public

function Constructor(...) {         this.membername = value; }Constructor.prototype.membername = value;
private

function Constructor(...) {         var that =this;         var membername = value;         function membername(...) {...} }
注意:函数声明function membername(...){...} 是下面这句var membername = function membername(...){...}的缩写;

privileged:

function Constructor(...) {         this.membername = function (...) {...}; }

thomescai http://blog.csdn.net/thomescai(转载请保留) 

参考资料:

 http://www.funnyhao.com/test/private-members-in-js.html 

你可能感兴趣的文章
set theme -yii2
查看>>
yii2 - 模块(modules)的view 映射到theme里面
查看>>
yii2 - controller
查看>>
yii2 - 增加actions
查看>>
网站加载代码
查看>>
php图像处理函数大全(缩放、剪裁、缩放、翻转、旋转、透明、锐化的实例总结)
查看>>
magento url中 uenc 一坨编码 base64
查看>>
强大的jQuery焦点图无缝滚动走马灯特效插件cxScroll
查看>>
Yii2.0 数据库查询
查看>>
yii2 db 操作
查看>>
mongodb group 有条件的过滤组合个数。
查看>>
yii2 用命令行操作web下的controller
查看>>
关于mongodb的 数组分组 array group
查看>>
MongoDB新的数据统计框架介绍
查看>>
mongodb fulltextsearch 关于语言的设置选项
查看>>
mongodb 增加全文检索索引
查看>>
symfony
查看>>
yourls 短连接 安装
查看>>
yii2 php namespace 引入第三方非namespace库文件时候,报错:Class not found 的解决
查看>>
softlayer 端口开放
查看>>