任何人都可以告诉我如何在javascript中使用或声明私人会员。我将欣赏一个例子。我是这个新手
答案 0 :(得分:8)
私有成员由构造函数构成。普通变量和构造函数的参数成为私有成员。
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