我知道在JS中模拟私有变量是可能的:
function ConstructorPattern() {
var privateVar = 'hi there';
this.getVar = function() {
return privateVar;
};
};
但是根据学习JavaScript设计模式的说法,当引用一些类似的代码时,类Car
和方法toString
上面是构造函数模式的一个简单版本,但它确实遇到了一些问题。一个是它使继承变得困难,另一个是为使用Car构造函数创建的每个新对象重新定义诸如toString()之类的函数。这并不是最优的,因为理想情况下,这个函数应该在Car类型的所有实例之间共享。
因此,在我的例子中给出的解决方案是通过原型添加getVar函数:
ConstructorPattern.prototype.getVar = function() {
return privateVar;
};
当然,这个函数不知道privateVar
是什么,所以它不能工作。我知道模块模式,但我特别希望能够实例化多个实例。
是否有任何方法在获得“私有”功能的同时“正确”地使用原型构造器模式?
编辑:--如果没有方法来实现这一点,那么对每个类实例重新定义方法真的很糟糕吗?我最近开始研究采用这种方法的代码库。似乎我唯一错过的就是遗产?
EDIT2:基于可接受答案的链接,将标记为副本。
发布于 2014-09-16 11:20:28
是否有任何方法在获得“私有”功能的同时“正确”地使用原型构造器模式?
不是的。这种具有特权函数的模式基于闭包作用域,不能使用共享函数。所有特权方法必须是特定于实例的。
如果没有一种方法来实现这一点,那么对每个类实例重新定义方法真的很糟糕吗?
不是的。现代JavaScript引擎很好地优化了这种模式。当然,有小小的头顶,但在典型的设置中您不会注意到。
似乎我唯一错过的就是遗产?
继承仍然是可能的,请参见在JAVASCRIPT模块模式中定义私有字段成员和继承。当然,派生子类不能直接访问父构造函数中声明的私有变量,但通常它们不需要这样做。
发布于 2014-09-16 11:05:41
当您在对象的原型上创建getVar时,当您执行以下操作时,不会调用它:
objectName.getVar();
因为原型的方法是在对象方法之后。下面的一个例子将向你展示我的意思:
function Car() {
var privy = "hidden";
this.getPrivy = function() {
return privy;
}
}
Car.prototype = {};
Car.prototype.getPrivy = function() {
return 'i came from prototype';
}
var obj = new Car;
obj.getPrivy();
JS遵循一个调用链,如:对象方法、->原型方法、->原型方法等。一路回到Object.prototype。当找到有效的方法时,它将停止并返回。在您的例子中,您的实例的方法比原型的方法更早。
https://stackoverflow.com/questions/25875793
复制相似问题