`
seadragonnj
  • 浏览: 59030 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Private Members in JavaScript(译)

阅读更多

声明:纯属自己翻着玩的!,

javascript的根本是对象,Arrays是对象,Functions是对象,Objects是对象,一切都是对象,那么对象是什么呢?对象是名

-值对的集合,名就是string ,值是string,numbers,booleans,和objects(包括arrays和functions),对象通常被实现的和hashtables一样,值可以很快被取回,
如果值是一个函数,我们可以认为它是一个方法,当一个对象
的方法被调用时,this关键字被指向这个对象,随后这个方法

能通过this访问这个实例,对象通过构造函数创建,构造函数是一个实例化对象的方法,在其它语言中类提供这个构造对象的特征,包括static variables and methods.

Public
一个对象的所有成员都是public的,任何函数都能访问、修改
、删除这些成员,并且也可以增加新的成员,有两种主要方法

来把一个成员对到一个新的对象中。
用构造函数(In the constructor)

这种技术通常被用来实例化公共的实例变量,这种变量的构造

方法是被用来增加成员到这个对象,
function Container(param) {
    this.member = param;
}

这样我们可以创建一个新的对象:

var myContainer=new Container('abc');

这时候,myContainer.member就被赋值为'abc'

用propotype

这种技术通常被用来增加公共的方法,当一个成员没有在这个对象中被发现时,那么它会被这个对象的constructor的

prototype捕获。原型机制是被用来实现继承的,It also conserves memory,通过为这个构造函数的propotype属性增加

一个函数,可以给所有的通过构造函数创建的对象增加一个方法,

Container.prototype.stamp = function (string) {
    return this.member + string;
}

然后,我们就可以调用这个方法了:

myContainer.stamp('def')

Private

private属性可以通过构造函数创建,正如我们所想的,这个构造函数的所有参数和变量自动就是private属性

function Container(param) {
    this.member = param;
    var secret = 3;
    var that = this;
}
这个构造函数创建了三个private 变量 param、secret、和
that,它们被依附到一个对象上,并且在这个对象的作用域外不可以访问,这个对象的public方法也不能访问它们,不过它们可以被private方法访问(private方法是这个对象的内联方法

(inner functions))

function Container(param) {

    function dec() {
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }

    this.member = param;
    var secret = 3;
    var that = this;
}

private函数检查secret这个变量的值,如果它大于0,它就把这个值减1并返回true,否则就返回false,它可以用来限制这

个的只能使用三次,

 作为惯例,我创建一个private的that属性,这是为了让这个private方法可以访问到这个对象,This is a workaround for

an error in the ECMAScript Language Specification which causes this to be set incorrectly for inner functions.

private方法不能被public方法调用,为了使这个私有方法有用,我们需要介绍一种特殊的方法,

Privileged

一个privileged方法是一个可以访问private变量和方法,同时自身对public方法是可见的,删除和替换一个privileged方法

是完全可能的,但修改它是完全不可能,或者强迫它放弃它的

secrets

privileged方法被到构造函数中,

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;
        }
    };
}

service是一个privileged方法,调用myContainer.service()的前三次将返回'abc',随后返回的就是null,service调用能

访问private属性secret的private方法dec,serivce对于其它对象和方法是可见的,但它是不允许直接访问私有的属性

Closures(闭包)

通过闭包实现public、private的模式是完全可能的,闭包的意思是只一个内联函数可以访问它的外部函数的变量,即使外部

函数返回以后。这是这种语言极其强大的功能,现在大部分javascript书都没有说这个怎么用,甚至都没有提到,

分享到:
评论

相关推荐

    AJAX资料(基础或中级水平的请看,对高手的帮助不大)

    压缩包内文档名如下: Core JavaScript 1.5 Guide Javascript面向对象 ...Private Members in JavaScript prototype手册 深入理解JavaScript闭包 悟透javascript(很好) 详解Javascript 中的this指针

    JavaScript的public、private和privileged模式

    在探讨JavaScript编程中,公共(public)、私有(private)和特权(privileged)模式是面向对象编程中用于管理对象内部成员的重要概念。JavaScript虽然是基于原型的语言,但它同样可以实现类似面向对象语言中的封装...

    如何在JavaScript对象中嵌入私有成员.doc

    1. 为何使用私有成员(Private Members) 私有成员的主要目的是限制对对象内部状态的访问。这在以下场景中尤为重要: - **数据安全性**:防止外部代码意外或恶意地改变对象的状态。 - **封装**:隐藏实现细节,...

    JavaScript 设计模式学习 Singleton

    // Everything returned in the object literal is public, but can access the members in the closure created above. return { // Public method. stringToArray: function(str, delimiter, stripWS) { if ...

    对javascript继承的理解

    例如,它无法实现私有成员(private members),因为所有的属性和方法最终都会暴露给子类。此外,虽然可以模拟静态方法和属性,但它们并不是真正意义上的静态,因为它们实际上是绑定到构造函数而不是类本身。 ES6...

    docme:从您项目的 jsdocs 生成与 github 兼容的 API 文档并将它们添加到您的自述文件中

    安装 npm install docme用法 docme <readme> <docme> -- <jsdoc> Generates jsdocs for non-private members of the project in the current folder. It then updates the given README with the githubified ...

    茶楼管理系统

    String sql = "INSERT INTO members(name, phone, balance) VALUES(?, ?, ?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, this.name); pstmt.setString(2, this.phone); pstmt.setDouble(3, ...

    chat-adv-service:通过Google AppsScripts与聊天服务进行交互

    入门创建有权访问聊天API的服务帐户添加ChatService与库ID项目1XDYAGcUoblJ073Kjveni2WOZHpKLYE8qlYMkeHViavLXvsKnBIl1DR2A 将privateKey和issuerEmail发送到ChatService.init方法返回的对象具有Spaces , Members和...

    python3.6.5参考手册 chm

    The json module: JavaScript Object Notation The plistlib module: A Property-List Parser ctypes Enhancements Improved SSL Support Deprecations and Removals Build and C API Changes Port-Specific ...

    2022年PHP面试题.doc

    - ASP(Active Server Pages)使用VBScript或JavaScript作为脚本语言,易于学习,但性能相对较低。 - PHP(Hypertext Preprocessor)跨平台,语法简洁,支持多种数据库,并且完全免费,适合快速开发。 - JSP...

    基于Java和mysql的聊天系统

    私聊涉及两个用户之间的消息传递,可以通过创建`private_chats`表来存储每条聊天记录,记录`sender_id`、`receiver_id`和`message`等信息。群聊则需要`groups`表来存储群组信息,`group_members`表记录用户与群组的...

    NodeJS:Node.js编程语言

    // public members } } 模块图案结构 var Calculator = function ( ) { // private member var elDom = document . getElementById ( 'el' ) ; return { // expose public member add : function ( x ,

    php json_encode与json_decode详解及实例

    例如,类`Foo`的`public_ex`会被编码,而`private_ex`、`protected_ex`以及常量`ERROR_CODE`和方法`getErrorCode()`则不会。 四、`json_decode` `json_decode`函数将JSON字符串转换为PHP的数据结构。默认情况下,它...

    php面试题(PHP软件工程师面试宝典)

    - 支持多种脚本语言如 VBScript 和 JavaScript; - 可以在 Windows 平台上无缝集成 IIS; - 提供了强大的 COM 组件支持,便于创建复杂的应用程序。 - **缺点:** - 依赖于 Windows 和 IIS,跨平台性差; - 性能...

    FinalPOO:面向对象的东方节目总决赛

    而标签“TypeScript”表明这个项目使用了TypeScript语言,它是JavaScript的一个超集,提供了静态类型检查和现代语言特性,如类、接口和泛型,极大地增强了代码的可维护性和可靠性。 在TypeScript中,面向对象的核心...

Global site tag (gtag.js) - Google Analytics