4

谁能告诉我我们如何在javascript中使用或声明私有成员。我会很感激一个例子。我是新手

4

6 回答 6

8

道格拉斯·克罗克福德(Douglas Crockford)有一篇关于私人会员的文章:

私有成员由构造函数创建。构造函数的普通变量和参数成为私有成员。

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 检查秘密实例变量。如果它大于零,它会递减 secret 并返回 true。否则返回false。它可用于使此对象仅限于三种用途。

按照惯例,我们将那个变量设为私有。这用于使对象可用于私有方法。这是 ECMAScript 语言规范中错误的解决方法,该错误导致内部函数的设置不正确。

私有方法不能被公共方法调用。为了使私有方法有用,我们需要引入一个特权方法。

于 2013-01-25T06:53:38.790 回答
4

这是一种方法:

function TheClass() {
    var _this = this;
    var privateMember = 'foo';
    this.publicMember = 'bar';

    var privateMethod = function(){
        // things happen here
    };

    this.publicMethod = function(){
        //other things here
        _this.publicMember = 'sparky';
        return privateMember;
    };
}

var myObj = new TheClass();

alert(myObj.privateMember);  //won't work
alert(myObj.publicMember);   //should work
alert(myObj.publicMethod()); //should work too

看看这个工作小提琴并玩一下它;)

于 2013-01-25T06:54:24.897 回答
1

JavaScript 没有单独的私有变量。在 JS 中,变量的作用域是最近函数的顶部。因此,创建函数(或闭包)是一种使私有变量只能在该范围内访问的方法。要记住的重要一点是始终使用var来声明变量,否则,即使在函数内部,变量也会变成全局变量,这很糟糕。

如果您正在使用原型继承,那么它就像创建构造函数一样简单,并且声明的任何变量var都将是私有的,而声明的变量this将是公共的。

function Bar() {
  var foo = ''; // private
  this.baz = function() {}; // public
}

var bar = new Bar(); // create new instance of Bar
alert(bar.foo); // error
alert(bar.baz); // function

上面的构造函数也很简单,通常你会把函数方法放在prototype对象的实际值上,比如Bar.prototype.baz = function(){}.

例如,如果您正在使用单例,则可以使用模块模式:

var bar = (function(){ // bar is public

  var foo = ''; // foo is private
  function baz() {}; // baz is private  

  return {
    baz: baz // expose 'baz' as a public member of 'bar'
  }

}());

alert(bar.foo); // error
alert(bar.baz); // function 
于 2013-01-25T06:59:35.933 回答
1

你可以试试这个https://www.npmjs.com/package/private-members

此包将按实例保存成员。

const pvt = require('private-members');
const _ = pvt();

let Exemplo = (function () {    
    function Exemplo() {
        _(this).msg = "Minha Mensagem";
    }

    _().mensagem = function() {
        return _(this).msg;
    }

    Exemplo.prototype.showMsg = function () {
        let msg = _(this).mensagem();
        console.log(msg);
    };

    return Exemplo;
})();

module.exports = Exemplo;
于 2018-10-11T12:17:51.987 回答
0

私有成员由构造函数创建。构造函数的普通变量和参数成为私有成员。

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

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

您可以在此链接上找到更多详细信息。

于 2013-01-25T06:53:29.273 回答
0

(目前的草案)ECMAScript 2022 规范包括私有标识符的概念。请参阅MDN 上的私有类功能:

默认情况下,类字段是公共的,但可以使用哈希 # 前缀创建私有类成员。这些类特性的隐私封装由 JavaScript 本身强制执行。

大多数流行的 JS 引擎已经支持它。

例子:

class Animal {
    #owner;
    
    constructor(name, owner) {
        this.name = name;
        this.#owner = owner;
    }
    
    hasOwner() {
        return Boolean(this.#owner);
    }
}

let dog = new Animal("blacky", "trincot");
console.log(dog.hasOwner()); // true
console.log("#owner" in dog, "#owner" in Animal.prototype); // false, false

于 2021-07-22T06:29:45.520 回答