我们如何防止以下代码中的危险行为?
var ee = require('events').EventEmitter;
var util = require("util");
util.inherits(strr, ee);
function strr() {
ee.call(this);
this._events = 0; // modify the private member value in parent
}
如果您不知道this._events是父EventEmitter对象中的私有变量成员,则内部数据会被您自己(继承类)破坏(变异)。
但是我们不能完全了解父级私有成员。
上面的代码使用了node.js,并不是那么容易理解问题。
我再加一些
function Parent() {
this.x = 0;
this.y = 0;
this._secre = 1;
}
Parent.prototype.run = function(x, y) {
if (this._secre) {
console.log('run');
}
};
function Child() {
Parent.call(this); // call super constructor.
this._secret = 0; //accidently make the same member name with the parent
}
// subclass extends superclass
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
Child.prototype.show = function() {
this.run();
console.log("Show my secret -> %s", this._secret);
};
var child = new Child();
console.log('Is child an instance of Child? ' + (child instanceof Child)); // true
console.log('Is child an instance of Parent? ' + (child instanceof Parent)); // true
child.show();
它将输出
Is child an instance of Child? true
Is child an instance of Parent? true
run
Show my secret -> 0
但是,如果您不小心用_secret命名了孩子的_secre成员,那么您将不会获得“运行输出”
function Parent() {
this.x = 0;
this.y = 0;
this._secre = 1;
}
Parent.prototype.run = function(x, y) {
if (this._secre) {
console.log('run');
}
};
function Child() {
Parent.call(this); // call super constructor.
this._secre = 0; //accidently make the same member name with the parent
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
Child.prototype.show = function() {
this.run();
console.log("Show my secret -> %s", this._secre);
};
var child = new Child();
console.log('Is child an instance of Child? ' + (child instanceof Child)); // true
console.log('Is child an instance of Parent? ' + (child instanceof Parent)); // true
child.show();
最佳答案
不,阻止外部脚本访问“私有”变量的唯一方法是在函数内部限定该私有变量的范围:
;(function() {
var private_var;
)());
对于要在对象内部内部使用但不能在对象外部访问的对象属性,通常使用下划线前缀命名约定。
obj._private
但是实际上并没有阻止其他开发人员访问此类属性(如果他们可以访问其父对象)并可能更改其值的方法。