请考虑以下代码:
create table customer parallel 2 nologging as
select /*+parallel(source 4) */ * mk.num,
nm.id_prefix||substr(mk.subid,6) new_sub_id,
nm.id_prefix||substr(mk.custid,6) new_cust_id
from user_info mk,numbersegment nm where mk.num >=nm.startnum and mk.num <=nm.endnum;
输出是: 五 未定义 11
为了简化代码阅读,我更喜欢将方法添加到原型var Tree = function() {
// private variables in closure
var fruits = 5;
var smallBranches = 10;
// public variables
this.bigBranches = 11;
this.countFruits = function() {
console.log(fruits);
};
};
Tree.prototype.countBranches = function() {
console.log(this.smallBranches);
console.log(this.bigBranches);
};
var tree = new Tree();
tree.countFruits();
tree.countBranches();
而不是像countBranches()
这样的内部构造函数。但是,缺点是原型函数无法访问Tree的私有变量。有没有办法做到这一点?
答案 0 :(得分:5)
但是,缺点是原型函数无法访问Tree的私有变量。有没有办法做到这一点?
所以你想要一个非私有的私有变量。不,没有办法做到这一点。只有任何函数都可以访问其他函数的内部状态。
但是,如果您使smallBranches
私有的目的是阻止它被覆盖,您可以在添加访问者时将其保密:
var Tree = function() {
// private variables in closure
var smallBranches = 10;
...
this.getSmallBranches = function() { return smallBranches; };
};
Tree.prototype.countBranches = function() {
console.log(this.getSmallBranches());
};
或者,如果您希望能够直接说出this.smallBranches
,请将其设为仅包含getter的实例属性:
var Tree = function() {
// private variables in closure
var smallBranches = 10;
Object.defineProperty(this, 'smallBranches', {
get() { return smallBranches; }
});
}
Tree.prototype.countBranches = function() {
console.log(this.smallBranches);
this.smallBranches = 42; // will fail
};
答案 1 :(得分:0)
实际上,通过原型,外部构造函数关联成员函数的方法是将成员函数添加到javascript中的类型的标准方法。由于未将smallBranches
变量与当前对象相关联,因此未定义。因此,它最终成为局部变量,并且在构造函数外部无法访问。你必须把它作为一个成员变量。
更改您的代码,如下所示: -
var Tree = function() {
// private variables in closure
var fruits = 5;
this.smallBranches = 10;
// public variables
this.bigBranches = 11;
this.countFruits = function() {
console.log(fruits);
};
};