谁能告诉我我们如何在javascript中使用或声明私有成员。我会很感激一个例子。我是新手
6 回答
道格拉斯·克罗克福德(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 语言规范中错误的解决方法,该错误导致内部函数的设置不正确。
私有方法不能被公共方法调用。为了使私有方法有用,我们需要引入一个特权方法。
这是一种方法:
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
看看这个工作小提琴并玩一下它;)
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
你可以试试这个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;
私有成员由构造函数创建。构造函数的普通变量和参数成为私有成员。
function Container(param) {
this.member = param;
var secret = 3;
var that = this;
}
此构造函数生成三个私有实例变量:param、secret 和 that。它们附加到对象上,但外部无法访问它们,对象自己的公共方法也无法访问它们。私有方法可以访问它们。私有方法是构造函数的内部函数。
您可以在此链接上找到更多详细信息。
(目前的草案)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