我有一个我需要转换的现有类,所以我可以在主对象定义之后追加像 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调用。
答案 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();
关于发生了什么[编辑]:
希望它有所帮助, - 凯文
答案 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());