有一种方法可以知道哪个类拥有一个函数? 例如:
function globalFunc(){
//alert MyObject
}
function MyObject(){
}
MyObject.prototype.test=function(){
globalFunc();
}
var o=new MyObject();
o.test(); //alert MyObject
现在我正在使用此解决方法:
function globalFunc(){
alert(globalFunc.caller.__class__);
}
function MyObject(){
}
MyObject.prototype.test=function(){
globalFunc();
}
MyObject.prototype.test.__class__=MyObject;
var o=new MyObject();
o.test(); //alert MyObject
但是有一个大问题,看看这个:
function globalFunc(){
alert(globalFunc.caller.__class__);
}
function MyObject(){
}
MyObject.prototype.test=function(){
var temp=function(){
globalFunc();
}
temp();
/* to simulate a simple closure, this may be for example:
element.addEventListener("click",temp,false);
*/
}
MyObject.prototype.test.__class__=MyObject;
var o=new MyObject();
o.test(); //alert undefined
那么,有一个明确的方法来获得这个? 我知道问题出在哪里(类属性只是test而不是temp的属性),但我也不能将 class 添加到temp。
感谢。
感谢您的回复,一些澄清。
我正在尝试与私人成员一起进行个人框架OO。
所以:
globalFunc 是一个特殊的函数,我用它来获取“私有”属性,我不能用call方法调用它或传递一些参数,唯一的参数im pass是“this”:
示例,$()是全局的
Class({
public:{
MyClass:function(){
},
setName:function(name) {
$(this).name=name; //set the private var name
},
getName:function(){
return $(this).name;
}
},
private:{
name:"UNKNOWN"
}
})
var o=new MyClass();
o.getName(); // UNKNOWN
o.setName("TEST!!!");
o.getName(); // TEST!!!
o.name; //undefined
$(o).name; //undefined
要使用继承,$(),我需要知道什么类调用它和类的对象。
一切都很好,但如果我需要访问clousure中的私人成员,我必须添加 的 __类__ 物业到clouser !!我不想要这个!
再次感谢,抱歉我的英语不好,我不是母语。
答案 0 :(得分:3)
在javascript中没有类。相反,几个对象可以“拥有”相同的功能。例如:
function myFun(){
alert(this.name);
}
function Obj1(){
this.name = "obj1";
}
Obj1.prototype.fun = myFun;
function Obj2(){
this.name = "obj2";
}
Obj2.prototype.fun = myFun;
var obj1 = new Obj1();
var obj2 = new Obj2();
obj1.fun();
obj2.fun();
答案 1 :(得分:2)
你的情景并不完全清楚,但这里有一些选择: -
function globalFunc()
{
alert(this.__class__);
//Note globalFunc now has access to much more.
}
function MyObject(){ }
MyObject.prototype.test=function(){
globalFunc.call(this);
}
MyObject.prototype.__class__=MyObject;
为事件处理添加闭包
MyObject.prototype.test = function(){
var self = this;
var elem = //get some element;
//Not cross-browser but for illustration
elem.addEventListener('click', fnEvent);
function fnEvent() { globalFunc.call(self); }
elem = null
}
答案 2 :(得分:1)
我不太清楚你想要做什么,但这里的想法可以激发你的灵感 当我尝试将JS用作OO语言时,“构造函数”属性对我有帮助。
o.constructor
将为您提供myObject
函数参考。
但在我看来,你应该尝试使用函数式编程而不是OO来充分利用Javascript
答案 3 :(得分:0)
temp
是调用者,但它没有属性__class__
。您只为test
定义了该内容。
答案 4 :(得分:0)
caller
非标准化且非常脆弱;最好避免。明确传递价值要好得多:
MyObject.prototype.test= function() {
element.addEventListener('click', function() {
globalFunc(MyObject);
});
};
或:
MyObject.prototype.test= function() {
var myclass= arguments.callee.__class__;
element.addEventListener('click', function() {
globalFunc(myclass);
});
};
答案 5 :(得分:0)
JavaScript中没有“拥有”函数。函数是JavaScript中的第一类对象,这意味着它们可以像任何其他变量一样传递,并被指定为许多对象的属性。
函数体内的 this
将为您提供对调用函数的对象的引用,如果作为方法调用(例如myObj.myMethod()
)或通过函数原型call()
调用或apply()
方法(例如myFunc.call(myObj)
)。在自己调用的函数内(例如myFunc()
),this
通常是全局对象(与大多数浏览器中的window
相同)。
答案 6 :(得分:0)
简短的回答,确实无法做你想做的事。 Javascript就是这样不起作用。
答案很长......
我见过的几乎每个使用经典对象模型的语言来到JavaScript的程序员都试图做你正在做的事情:模仿他们习惯使用Javascript的经典OOP样式。 这里没有羞耻,我做到了这一点,即使着名的道格拉斯·克罗克福德对此进行了实验,然后放弃了。我也是。我仍然认为,为了真正学习语言,我尝试这些东西是必要的。
不要被花括号和熟悉的操作员所迷惑。它的核心与Java几乎没有共同之处! JavaScript是一个功能齐全的语言:函数本身就是对象。
直言:没有办法做你想做的事 - 拥有私人属性的对象,你可以通过这个 访问说这很容易:)了解如何应用更难
没有类,只有对象。 对象只有属性。 对象的属性可能具有值。 这些值可能是函数。 这个在调用函数时设置,它可以是任何
Closure是在JavaScript中实现真正隐私的唯一方法。其他所有内容都泄漏到一些封闭的范围内,依赖于混淆的属性名称,或者可以被调用者以某种方式规避,或者甚至在不再引用对象后泄漏内存(因为没有析构函数来执行清理)在)。
你正在做的事情仍然是尝试和做的好事,通过尝试它你将成为一个更好的JavaScript程序员通过弄清楚: 为什么你不能做一些 更重要的是你可能不应该
的原因