javascript中的私人成员

时间:2013-01-25 06:49:40

标签: javascript

任何人都可以告诉我如何在javascript中使用或声明私人会员。我将欣赏一个例子。我是这个新手

6 个答案:

答案 0 :(得分:8)

道格拉斯·克罗克福德在Private Members上发表了一篇文章:

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

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

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

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语言规范中的错误的解决方法,导致对内部函数的设置不正确。

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

答案 1 :(得分: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

请参阅此working fiddle并稍微了解一下;)

答案 2 :(得分: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 

答案 3 :(得分: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;

答案 4 :(得分:0)

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

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

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

您可以在this link找到更多详细信息。

答案 5 :(得分:0)

(当前草案)ECMAScript 2022 规范包含私有标识符的概念。请参阅 MDN 上的 Private class features

<块引用>

默认情况下,类字段是公开的,但可以使用哈希 # 前缀创建私有类成员。这些类特性的隐私封装是由 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