var myprivate
プライベート インスタンス変数をシミュレートする唯一の方法は、コンストラクター関数のように宣言することです。
特権メソッド (=プライベート メンバーにアクセスできるメソッド) は、コンストラクター関数の本体内でも宣言する必要があるため、プロトタイプにすることはできません (余分な CPU とメモリが必要になり、一部のモデルでは最適化されない可能性があります)。 JS エンジン)。
私の意見では、コストは利益に値しないので、これを行う必要がある状況は一度もありませんでした. 通常、広く使用されている命名規則 (アンダースコアで始まる名前) によって、メンバーが非公開であることを将来の自分や他のプログラマーに示します。_myPrivate
「パブリックオーバーライド」の答えは、次のコードを作成するきっかけになりました。プライベート インスタンス メンバーはパブリックにアクセスできますben._data.set
。または、ルールやゲッター/セッターを再実装して、誰かがそれを悪用できるようにすることもできます。オブジェクトのパブリックにアクセス可能なメンバーをクリーンアップし、ゲッターとセッターを使いやすくすることができます。
//Namespacing DataStore to limit scope of the closures
var tools = {
DataStore : function(){
var store = [];
this.get = function(key){
return store[key];
};
this.set = function(key,value){
store[key] = value;
return value;
};
}
};
//Person constructor
var Person = function(name){
//you can access this member directly
// bob.name = "Lucy";
this.name=name;
//if having _data as not accesable by defining
// with var _data we whould have to define
// get and set here as this.get and this.set
this._data=new tools.DataStore();
};
//constant value used to get or set, for example:
//ben.get(ben.AGE);
//Could add this and rules to Person instead of Person.prototype
//then you'll need a helper function to set up inheritance
//to make sure the static's on Person are copied to it's children
Person.prototype.AGE=0;
//rules for getters and setters
//Will be a problem with inheritance if on prototype
//function Employee(name){Person.call(this,name);};
//Employee.prototype=Object.create(Person.prototype);
//Employee.prototype.rules["0set"]=..overwrites Person.prototype.rules["0set"]
//When inheriting you need to have a helper function set the rules for a child
//object
Person.rules = {}
//rule for AGE set
Person.rules[Person.prototype.AGE+"set"] = function(val){
var tmp;
tmp = parseInt(val);
if(isNaN(tmp)){
throw new Error("Cannot set the age of the person "+
"to non number value, value of age:"+val);
}
if(tmp>150){
throw new Error("Are you sure this is a person and "+
"not a turtule? Trying to set age to:"+val);
}
return this._data.set(this.AGE,tmp);
};
//rule for age get
Person.rules[Person.prototype.AGE+"get"] = function(){
return this._data.get(this.AGE);
};
Person.prototype.get = function(key){
return Person.rules[key+"get"].call(this);
};
Person.prototype.set = function(key,value){
return Person.rules[key+"set"].call(this,value);
};
var ben = new Person("Ben");
ben.set(ben.AGE,22);
console.log(ben.get(ben.AGE));
try{
ben.set(ben.AGE,151);
}catch(e){
console.log("error",e);
}
try{
ben.set(ben.AGE,"HELLO WORLD!");
}catch(e){
console.log("error",e);
}
注意: Person.rules
Person から継承する場合は、 Child インスタンスにコピーする必要があります。
プロトタイプ、継承、オーバーライド、スーパーの呼び出し、多重継承 (ミックスイン)、およびthis
ここの値の詳細: https://stackoverflow.com/a/16063711/1641941