Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Javascript 中的私有成员 #16

Open
LiZheGuang opened this issue Jan 19, 2020 · 0 comments
Open

Javascript 中的私有成员 #16

LiZheGuang opened this issue Jan 19, 2020 · 0 comments

Comments

@LiZheGuang
Copy link
Owner

Javascript 中的私有成员

JavaScript是世界上最容易被误解的编程语言。一些人认为它缺乏信息隐藏的特性,因为对象不能具有私有实例变量和方法。但这是一个误会。JavaScript对象可以具有私有成员。

Objects

JavaScript从根本上讲就是对象。数组是对象。功能是对象。对象就是对象。那么什么是物体?对象是名称-值对的集合。名称是字符串,值是字符串,数字,布尔值和对象(包括数组和函数)。对象通常实现为哈希表,因此可以快速检索值。

Public

对象的成员都是公共成员。任何功能都可以访问,修改或删除这些成员,或添加新成员。将成员放入新对象的主要方法有两种:

在构造函数中

此技术通常用于初始化公共实例变量。构造函数的this变量用于将成员添加到对象。

function Container(param) {
    this.member = param;
}

因此,如果我们构造一个新对象

var myContainer = new Container('abc');

然后myContainer.member包含“ abc”。

在原型中

Private

私有成员由构造函数组成。构造函数的普通var和参数成为私有成员。

function Container(param) {
    this.member = param;
    var secret = 3;
    var that = this;
}

该构造函数生成三个私有实例变量:param,secret和that。它们被附加到对象上,但是它们不能被外部访问,也不能被对象自己的公共方法访问。私有方法可以访问它们。私有方法是构造函数的内部函数。

function Container(param) {

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

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

私有方法dec检查​​秘密实例变量。如果它大于零,则它会减小秘密并返回true。否则,它返回false。
可用于使该对象限于三种用途。按照惯例,我们将私有变量设为私有。这用于使对象可用于私有方法。
这是针对ECMAScript语言规范中错误的解决方法,该错误导致内部函数设置错误。私有方法不能被公共方法调用。为了使私有方法有用,我们需要引入特权方法。

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

Closures

由于JavaScript具有闭包,因此可以使用这种公共,私有和特权成员模式。这意味着即使返回外部函数,内部函数也始终可以访问其外部函数的vars和参数。这是该语言极其强大的属性。JavaScript的工作方式中对此进行了描述。

私有和特权成员只能在构造对象时创建。可以随时添加公共成员。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant