Javascript如何获取私有变量
Javascript How to get Private variables
在JavaScript中,我试图实现私有变量(就像在其他OOP语言中一样)。
是否只有通过闭包才能实现,或者是否有其他方法可以实现私有变量?
任何例子都会非常有用。
对于一个类(函数),它只是使用"var"与"this":
function myObject() {
var myPrivateVariable = 10;
this.myPublicVariable = 20;
}
私有成员由构造函数生成。构造函数的普通变量和参数成为私有成员。
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。它可以用于将此对象限制为三种用途。
按照惯例,我们生成一个私有的this
变量(that
)。这用于使对象对私有方法可用。这是ECMAScript语言规范中错误的解决方法,该错误导致内部函数的this
设置不正确。
公共方法不能调用私有方法。为了使私有方法变得有用,我们需要引入一个特权方法。
作为参考,你可以看到这个http://javascript.crockford.com/private.html
任何变量只有在其定义的函数中才是已知的。因此,Sahil Grover公认的答案几乎涵盖了基本内容,除了最近添加到JavaScript规范中的一个:let
语句。
在Node.js和现代浏览器中,您现在也可以执行以下操作:
function loop(arr) {
// i IS NOT known here
// j IS NOT known here
for( var i = 0; i < arr.length; i++ ) {
// i IS known here
};
// i IS known here
// j IS NOT known here
for( let j = 0; j < arr.length; j++ ) {
// j IS known here
};
// i IS known here
// j IS NOT known here
}
let varName = ...
仅对其所在的块已知。因此,在这种情况下,我们的变量j
仅在第一个for循环中已知,而在循环之前和之后未知。如果使用var varName = ...
,则从定义它的那一刻起,它在整个函数中都是已知的。
现在,让我们超越基础知识。
JavaScript的优势在于,它在定义对象方面给了你很大的自由。然而,这也是一个弱点,因为时至今日,几乎每个人都有自己的JavaScript OOP方法。
我自己编写的大多数JavaScript代码通常使用以下模式:
var keyValueStore = (function() {
// Private "static" properties go here
var count = 0;
var kvs = function() {
// Here, you can define private instance properties as "var property = ..."
// You can also define public instance properties as "this.property = ..."
count++;
};
kvs.prototype = {
// Public instance properties can also go here
‘data’ : {},
‘get’ : function(key) {
return this.data[key];
},
‘set’ : function(key, value) {
this.data[key] = value;
},
‘delete’ : function(key) {
delete this.data[key];
},
‘getLength’ : function() {
var l = 0;
for (p in this.data) l++;
return l;
}
};
return {
// Public "static" properties go here
‘create’ : function() { return new kvs(); },
‘count’ : function() { return count; }
};
})();
正如我在代码中的注释所示,这种模式允许您定义";静态";属性("类"级别的属性)和实例属性,两者都可以是私有的或公共的。与我见过的其他一些模式不同,它这样做不会让代码变得很难理解。
用法:
kvs = keyValueStore.create();
kvs.set(‘Tom’, “Baker”);
kvs.set(‘Daisy’, “Hostess”);
var profession_of_daisy = kvs.get(‘Daisy’);
kvs.delete(‘Daisy’);
console.log(keyValueStore.count());
- 从javascript变量获取php会话
- 是否将Javascript变量保存为PHP变量?获取、发布、COOKIE
- 从动态变量获取数组
- PHP 和 Javascript:使用 Javascript 变量获取文件内容
- 如何从 php 变量获取值到我们的 javascript 文件中
- 从 javascript 变量获取 InnerHtml
- 如何使用此变量获取 typeahead.js 中输入的 id
- 使用参数变量获取传递给 ES6 箭头函数的参数
- 如何将此值作为变量获取
- Javascript-使用一个变量获取数组的一部分
- 无法使用AJAX将JS变量获取到PHP
- 从angularjs中的变量获取数据
- 使用jquery中的变量获取字段值
- 将变量获取到url并导航选定的变量
- 将Struts2 valuestack变量获取到JQuery
- Javascript-使用变量获取对象值
- 为每个变量获取一个新的随机数
- 从JavaScript中的第二个变量获取名为的变量的值
- 使用变量获取 JavaScript 值
- HTML选择列表-通过传递变量获取文本值