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

Posted

技术标签:

【中文标题】Javascript - 获取函数(方法)的类所有者【英文标题】:Javascript - get class owner of a function(method) 【发布时间】:2010-12-06 07:28:15 【问题描述】:

有办法知道哪个类拥有一个函数吗? 示例:

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

那么,有一个明确的方法来获得这个吗? 我知道问题出在哪里(class 属性是仅 test 而不是 temp 的属性),但我也无法将 class 添加到 temp。

谢谢。


感谢您的回复,一些澄清。

我正在尝试做一个面向私人成员的个人框架OO。

所以:

globalFunc 是一个特殊的函数,我用它来获取“私有”属性,我不能用 call 方法调用它或传递一些参数,唯一的参数我通过的是“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 中的私人成员,我必须添加 __class__ 财产关闭!我不想要这个!

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

【问题讨论】:

您将不得不忘记在 javascript 中存在“类”之类的东西。没有。 【参考方案1】:

在 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();

【讨论】:

@CoDEmanX ES6 类只是语法糖。在类中定义方法与在构造函数的原型上设置方法是一样的【参考方案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

【讨论】:

【参考方案3】:

我不太了解您要做什么,但这里有一个可以启发您的想法。 当我尝试将 JS 用作 OO 语言时,“构造函数”属性对我很有帮助。

o.constructor 将为您提供myObject 函数参考。

但在我看来,你应该尝试函数式编程而不是 OO 来充分利用 Javascript

【讨论】:

【参考方案4】:

temp 是调用者,但它没有 __class__ 属性。您只为test 定义了它。

【讨论】:

是的..我确实在这里问是否有人知道另一种解决方案。 ps。我也无法将 class 属性添加到 temp。【参考方案5】:

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);
    );
;

【讨论】:

【参考方案6】:

函数在 JavaScript 中不是“拥有”的。函数是 JavaScript 中的第一类对象,这意味着它们可以像任何其他变量一样被传递并作为许多对象的属性分配。

函数体内的this 会给你一个对调用函数的对象的引用,如果作为方法调用(例如myObj.myMethod())或通过函数原型的call()apply() 方法(例如myFunc.call(myObj))。在单独调用的函数内部(例如myFunc()),this 通常是全局对象(与大多数浏览器中的window 相同)。

【讨论】:

【参考方案7】:

简短的回答,真的没有办法做你想做的事。 Javascript 就是不能那样工作。

长答案...

我遇到的几乎所有从使用经典对象模型的语言转向 JavaScript 的程序员都尝试过您正在做的事情:模仿他们习惯使用 Javascript 的经典 OOP 风格。 这里没有什么丢人的,我就是这么做的,就连大名鼎鼎的道格拉斯·克罗克福德都试过这个,后来就放弃了。我也是。我仍然认为尝试这些东西以真正学习语言对我来说是必要的

不要被花括号和熟悉的运算符所迷惑。从本质上讲,它与 Java 几乎没有共同之处! JavaScript 是一种函数式语言:函数本身就是对象。

坦率地说:没有办法做你想做的事 - 拥有可以通过 this

访问的具有私有属性的对象

说起来容易 :) 理解如何应用更困难

没有类,只有对象。 对象只有属性。 对象的属性可能具有值。 这些值可能是函数。 this 在函数被调用时设置,它可以是任何东西

闭包是在 JavaScript 中实现真正隐私的唯一方法。其他所有内容要么泄漏到某个封闭范围内,依赖于混淆的属性名称,要么可以被调用者以某种方式规避,或者即使在您的对象不再被引用后也会泄漏内存(因为没有析构函数来进行清理中)。

你正在做的事情仍然是一件值得尝试和去做的好事情,通过尝试,你将成为一个更好的 JavaScript 程序员,通过弄清楚: 为什么你不能做一些 更重要的是为什么你可能不应该

【讨论】:

以上是关于Javascript - 获取函数(方法)的类所有者的主要内容,如果未能解决你的问题,请参考以下文章

获取自身内部的类函数名称

Javascript Math

java 获取所有带注解的类

JavaScript的内置对象(Math对象)

在Typescript中,如何在工厂(ish)函数中实例化的类上获取方法的通用返回类型

JavaScript一个cookie存储的类