Javascript - 获取函数的类所有者(方法)

时间:2009-10-13 12:50:14

标签: javascript class object methods

有一种方法可以知道哪个类拥有一个函数? 例如:

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 !!我不想要这个!

再次感谢,抱歉我的英语不好,我不是母语。

7 个答案:

答案 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程序员通过弄清楚:  为什么你不能做一些  更重要的是你可能不应该

的原因