我正在寻找一种完美的方法来定义课程。 “完美”在这里意味着:“
例如,方式1:
function Foo1() {
var private1;
this.publicMethod1 = function() {//create instance will create copy of this function}
}
不符合上述第1条规则。
另一个例子,方式2:
function Foo2() {
var private2;
}
Foo2.prototype.Method2 = function() {//cannot access private2}
不符合上述第2条规则。
那么可以满足这两个规则吗?感谢。
答案 0 :(得分:1)
在JavaScript中,它更多地是关于约定。私有属性或方法首先使用下划线定义,如_private
。有了一些助手,您可以轻松地上课。我觉得这个设置很简单,只需要一个助手inherits
来扩展类,而不是使用多个参数,而是在对象props
中传递,只需在继承的类上调用“super”{ {1}}。例如,使用模块模式:
arguments
关于私有变量“问题”只是坚持例如属性的约定,并在需要其他所有私有时使用闭包。
答案 1 :(得分:0)
function Foo3() {
this.private = {};
}
Foo3.prototype.set_x = function (x) {
this.private.x = x;
};
答案 2 :(得分:0)
长话短说:不,不是。您无法使用可以访问private
变量的方法扩展原型。至少如果通过closure
将这些私有变量设为私有。
但是,javascript中的惯例是您使用下划线标记您的私有字段,例如_myPrivateField
。这些仍然是公开的,但我已经看到这个解决方案在许多图书馆中使用,我也更喜欢这种风格来满足你的第一条规则。
答案 3 :(得分:0)
一个基本的例子如下:
Foo = function(id)
{
// private instances.
var _id;
var _self = this;
// constructor
_id = id;
// private method
function _get()
{
return _id;
};
// public function
_self.set = function(id)
{
_id = id;
};
_self.get = function()
{
return _get();
};
};
var bar = Foo(100);
console.log( bar.get() );
bar.set(1000);
console.log( bar.get() );
我建议您使用prototype。