Javascript - получить владельца класса функции (метода)

есть способ узнать, какому классу принадлежит функция? Пример:

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), но я не могу добавить класс к temp тоже.

Спасибо.


Спасибо за ответ, некоторые разъяснения.

Я пытаюсь сделать личную каркасную работу, ориентированную на частных лиц.

Так:

globalFunc - это специальная функция, я использую ее для получения «частного» свойства, и я не могу вызвать его с помощью метода вызова или передать некоторые аргументы, единственными аргументами, которые я передаю, является «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__ свойство Clouser !! И я не хочу этого!

Еще раз спасибо и извините за мой плохой английский, я не носитель языка.

13.10.2009 12:50:13
Вам придется отказаться от идеи, что в JavaScript существует такая вещь, как «класс». Там нет.
Jonathan Feinberg 13.10.2009 13:20:49
7 ОТВЕТОВ

tempявляется вызывающей стороной, но у нее нет свойства __class__. Вы только определили это для test.

0
13.10.2009 13:00:28
Да .. на самом деле я спрашиваю здесь, если кто-то знает другое решение.
user189086 13.10.2009 13:03:45
пс. я не могу добавить свойство класса в temp тоже.
user189086 13.10.2009 13:04:36

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);
    });
};
0
13.10.2009 13:02:42

Ваш сценарий не совсем понятен, но вот несколько вариантов:

 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
13.10.2009 13:10:25

В 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();
3
13.10.2009 13:05:12
Классы @CoDEmanX ES6 являются просто синтаксическим сахаром. Определение метода в классе аналогично установке метода в прототипе конструктора
Marius 30.01.2015 10:03:35

Функции не «принадлежат» в JavaScript. Функции - это объекты первого класса в JavaScript, что означает, что они могут передаваться как любая другая переменная и назначаться в качестве свойств многих объектов.

thisвнутри тела функции будет указана ссылка на объект, для которого была вызвана функция, если она вызывается как метод (например myObj.myMethod()) или через прототип функции call()или apply()методы (например myFunc.call(myObj)). Внутри функции, вызываемой самостоятельно (например myFunc()), thisобычно будет глобальный объект (такой же, как windowв большинстве браузеров).

0
13.10.2009 13:16:49

Я не очень хорошо понимаю, что вы пытаетесь сделать, но вот идея, которая может вас кое-что вдохновить.
Свойство «конструктор» мне очень помогло, когда я пытался использовать JS в качестве языка OO.

o.constructorдаст вам myObjectссылку на функцию.

Но, на мой взгляд, вы должны попробовать функциональное программирование вместо ОО, чтобы получить максимальную отдачу от Javascript

2
14.10.2009 21:29:19

Короткий ответ: действительно нет способа сделать то, что вы пытаетесь сделать. Javascript просто так не работает.

Длинный ответ ...

Почти каждый встреченный мной программист, пришедший на JavaScript из языка, использующего классическую объектную модель, пытался сделать то, что вы делаете: эмулировать классический стиль ООП, к которому они привыкли, с Javascript. Здесь нет ничего постыдного, я сделал это, даже знаменитый Дуглас Крокфорд экспериментировал с этим, а потом отказался. Я тоже. Я все еще думаю, что это было необходимым для меня, чтобы попробовать этот материал, чтобы действительно выучить язык

Не дайте себя одурачить фигурными скобками и знакомо выглядящими операторами. По своей сути он имеет мало общего с Java! JavaScript - это функциональный язык: функции являются объектами сами по себе.

Прямо: нет способа сделать то, что вы пытаетесь сделать - есть объекты с частными свойствами, к которым вы можете получить доступ через это

Сказать, что это легко :) Понимание того, как применять это сложнее

Нет классов, есть только объекты. Объекты имеют только свойства. Свойства объектов могут иметь значения. Эти значения могут быть функциями. это устанавливается , когда функция вызывается, это может быть что угодно

Закрытие является единственным способом достижения истинной конфиденциальности в JavaScript. Все остальное либо просачивается в какую-то ограничивающую область, опирается на запутанные имена свойств, либо может быть каким-либо образом обойдено вызывающей стороной, либо утечек памяти даже после того, как на ваши объекты больше не ссылаются (так как не существует функции-деструктора для выполнения вашей очистки в).

То, что вы делаете, - это все еще хорошая вещь, чтобы попытаться сделать это, сделав это, вы станете лучшим программистом JavaScript, выяснив: почему вы не можете сделать что-то более важное, почему вы, вероятно, не должны

0
17.10.2013 03:57:27