假设我有一个调用的javascript函数/类Foo,它有一个名为的属性bar.我希望在bar实例化类时提供值,例如:
var myFoo = new Foo(5);
Run Code Online (Sandbox Code Playgroud)
将设为myFoo.bar5.
如果我创建bar一个公共变量,那么这是有效的,例如:
function Foo(bar)
{
this.bar = bar;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想将其设为私有,例如:
function Foo(bar)
{
var bar;
}
Run Code Online (Sandbox Code Playgroud)
那么我如何设置私有变量的值bar,使其可用于所有内部函数foo?
我有以下课程
function Temp() {
var isHot=false;
return {
setHot: function(v) { isHot=v },
getHot: function() { return isHot; },
hot: isHot
}
}
var w = new Temp();
w.setHot(true);
w.hot !== w.getHot()
Run Code Online (Sandbox Code Playgroud)
如果我通过函数访问w对象,为什么我只看到更改的值?
在阅读http://javascript.crockford.com/prototypal.html之后,我一直在玩原型继承,并且在理解如何以我使用经典继承的方式使用它时遇到了一些问题.也就是说,原型继承的所有函数和变量基本上都是静态的,除非它们被子对象覆盖.请考虑以下代码段:
var Depot = {
stockpile : [],
loadAmmo : function (ammoType) {
this.stockpile.push(ammoType);
}
};
var MissileDepot = Object.create(Depot);
var GunDepot = Object.create(Depot);
Run Code Online (Sandbox Code Playgroud)
stockpile而loadAmmo这绝对是在原型,因为这两个MissileDepot和GunDepot有他们.然后我们运行:
MissileDepot.loadAmmo("ICBM");
MissileDepot.loadAmmo("Photon Torpedo");
alert(MissileDepot.stockpile); // outputs "ICBM,Photon Torpedo"
alert(GunDepot.stockpile); // outputs "ICBM,Photon Torpedo"
Run Code Online (Sandbox Code Playgroud)
这是预期的,因为既没有MissileDepot也没有GunDepot实际拥有stockpile或loadAmmo在他们的对象中,所以javascript查找继承链到他们的共同祖先.
当然我可以手动设置GunDepot的库存,正如预期的那样,解释器不再需要查找链条
GunDepot.stockpile = ["Super Nailgun", "Boomstick"];
alert(GunDepot.stockpile); // outputs "Super Nailgun,Boomstick"
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的.如果这是经典继承(比如Java),loadAmmo将独立地操作MissileDepot和GunDepot的库存,作为实例方法和实例变量.我希望我的原型能够声明孩子们常见的东西,而不是他们分享的东西.
所以也许我完全误解了原型继承背后的设计原则,但我不知道如何实现我刚刚描述的内容.有小费吗?提前致谢!
我试图弄清楚这一点或在谷歌上搜索它,我只能找到如何创建对象,而不是功能如何工作.如果有人能向我解释封装是如何工作的.
function myObject() {
this.variable1 = "tst";
this.function1 = function() {
//Now this function works. A 'this' function to a private function is ok
_PrivateFunction1();
//Here is error one, I cannot seem to call methods within the object
//from.
this.function2();
}
this.function2 = function() {
alert("look! function2!");
}
function _PrivateFunction1() {
//This does work though. I am confused.
_PrivateFunction2();
}
function _PrivateFunction2() {
alert("look! PrivateFunction1");
//this does not work.
alert(this.variable1);
}
}
Run Code Online (Sandbox Code Playgroud)