是否可以将函数附加到可以访问类的私有变量的JS类?

时间:2010-10-26 19:39:06

标签: javascript object prototypejs

我有一个我需要转换的现有类,所以我可以在主对象定义之后追加像 my_class.prototype.my_funcs.afucntion = function(){alert(private_var);} 这样的函数。转换现有类以使用此方法的最佳/最简单方法是什么?目前我有一个像这样构造的JavaScript对象:

var my_class = function (){

 var private_var = '';
 var private_int = 0
 var private_var2 = '';
 [...]

 var private_func1 = function(id) {
  return document.getElementById(id);
 };

 var private_func2 = function(id) {
  alert(id);
 };

 return{
  public_func1: function(){

  },

  my_funcs: {
   do_this: function{

   },
   do_that: function(){

   }
  }
 }
}();

不幸的是,目前,我需要根据用户选择的设置使用PHP动态地向这个对象添加函数和方法,可能没有添加任何函数或50.这使得添加功能非常复杂,因为要添加 my_class .my_funcs.afunction(); 函数,我必须在JS文件中添加一个PHP调用,以便它可以访问私有变量,它只会使一切变得如此混乱。

我希望能够使用原型方法,这样我就可以清除主JS文件中的所有PHP调用。

3 个答案:

答案 0 :(得分:0)

尝试像这样声明你的“班级”:

var MyClass = function () {
    // Private variables and functions
    var privateVar = '',
        privateNum = 0,
        privateVar2 = '',
        privateFn = function (arg) {
            return arg + privateNum;
        };
    // Public variables and functions
    this.publicVar = '';
    this.publicNum = 0;
    this.publicVar2 = '';
    this.publicFn = function () {
        return 'foo';
    };
    this.publicObject = {
        'property': 'value',
        'fn': function () {
            return 'bar';
        }
    };
};

您可以通过向其原型添加属性来扩充此对象(但除非您创建此类的实例,否则无法访问它们)

MyClass.prototype.aFunction = function (arg1, arg2) {
    return arg1 + arg2 + this.publicNum;
    // Has access to public members of the current instance
};

有用吗?

修改:确保您创建了MyClass的实例,否则任何内容都无法正常运行。

// Correct
var instance = new MyClass();
instance.publicFn(); //-> 'foo'
// Incorrect
MyClass.publicFn(); //-> TypeError

答案 1 :(得分:0)

好的,所以你构建课程的方式与我通常做的不同,但我能够得到以下工作:

var my_class = function() {
    var fn = function() {
        this.do_this = function() { alert("do this"); }
        this.do_that = function() { alert("do that"); }
    }
    return {
        public_func1: function() { alert("public func1"); },
        fn: fn,
        my_funcs: new fn()
    }
}
var instance    = new my_class();
instance.fn.prototype.do_something_else = function() { 
    alert("doing something else"); 
}
instance.my_funcs.do_something_else();

关于发生了什么[编辑]:

  • 我将my_funcs对象更改为私有方法'fn'
  • 我将对它的引用传递给返回对象实例中的类似名称'fn',以便您可以对其进行原型化。
  • 我使my_funcs成为私有成员fn的一个实例,以便它能够执行所有fn方法

希望它有所帮助, - 凯文

答案 2 :(得分:0)

也许我错过了你想要做的事情,但是你不能只在你创建它的时候将原型分配给实例吗?所以,首先创建你的原型对象:

proto = function(){
    var proto_func = function() {
        return 'new proto func';
    };
    return {proto_func: proto_func};
}();

然后使用它:

instance = new my_class();
instance.prototype = proto;
alert(instance.prototype.proto_func());