Javascript 如何确定函数作为方法的对象?

Javascript 如何确定函数作为方法的对象?,javascript,Javascript,当我调用bA.x时,我想知道x是在A中定义的。这可能吗?没有很好的内置方法来实现这一点,因为实际上Javascript中没有方法。它们是独立的函数对象,只是碰巧被分配到某个地方 如果您每次都创建新的函数实例,例如闭包[感谢Matthew Crumley指出这一点],那么您可以修改函数对象,使其与其父对象显式关联: var A = { x : function () { } }; var b = function (method) { //want to know method'

当我调用bA.x时,我想知道x是在A中定义的。这可能吗?

没有很好的内置方法来实现这一点,因为实际上Javascript中没有方法。它们是独立的函数对象,只是碰巧被分配到某个地方

如果您每次都创建新的函数实例,例如闭包[感谢Matthew Crumley指出这一点],那么您可以修改函数对象,使其与其父对象显式关联:

var A = {
    x : function () { }
};

var b = function (method) {
    //want to know method's "parent" here
};

b(A.x);
然后您可以正确地调用它,就好像它是一个方法一样:

x.parent = A;

否则,您将不得不同时传递函数及其父对象。

没有很好的内置方法来实现这一点,因为实际上Javascript中没有方法。它们是独立的函数对象,只是碰巧被分配到某个地方

如果您每次都创建新的函数实例,例如闭包[感谢Matthew Crumley指出这一点],那么您可以修改函数对象,使其与其父对象显式关联:

var A = {
    x : function () { }
};

var b = function (method) {
    //want to know method's "parent" here
};

b(A.x);
然后您可以正确地调用它,就好像它是一个方法一样:

x.parent = A;
否则,必须同时传递函数及其父对象


从语言的角度来看,这个问题没有什么意义,因为函数可能存在于许多对象上

<html>
<body>
<script>
var A = {
    x: function (a_a, a_b) { alert(a_a + a_b);  }
};

var b = function (a_method) {
    alert(a_method.toString());
    a_method.call(this, 1, 2);
};

b(A.x);
</script>
您可以使用所需的任何上下文调用x函数:

var a = { name : 'a' },
    b = { name : 'b' },
    c = { name : 'c' }; 
a.x = function () { alert( this.name ); };
c.x = b.x = a.x;  // a, b, and c all reference the same function
您可以操纵此行为为自己工作:

a.x(); // alerts "a" because "this" is object a 
b.x(); // alerts "b" because "this" is object b 
a.x.call( b ); // alerts "b" because "this" is object b (via parameter)

但是,无法从函数内部知道它被分配给什么对象,因为这不一定是一个单一的位置。

从语言的角度来看,这个问题没有什么意义,因为函数可能存在于许多对象上

<html>
<body>
<script>
var A = {
    x: function (a_a, a_b) { alert(a_a + a_b);  }
};

var b = function (a_method) {
    alert(a_method.toString());
    a_method.call(this, 1, 2);
};

b(A.x);
</script>
您可以使用所需的任何上下文调用x函数:

var a = { name : 'a' },
    b = { name : 'b' },
    c = { name : 'c' }; 
a.x = function () { alert( this.name ); };
c.x = b.x = a.x;  // a, b, and c all reference the same function
您可以操纵此行为为自己工作:

a.x(); // alerts "a" because "this" is object a 
b.x(); // alerts "b" because "this" is object b 
a.x.call( b ); // alerts "b" because "this" is object b (via parameter)

但是,无法从函数内部知道分配给哪个对象,因为这不一定是一个单一的位置。

即使添加父属性也不能在所有情况下都起作用,因为如果函数位于对象的原型中,则函数对象只有一个副本,所以无法判断它来自哪个实例。下面是一个示例来说明问题:

var b = function ( method ) {
  // parent = this;
};
b.call( A, A.x );
现在,a.x.parent和b.x.parent都设置为b

@只要每个对象都有自己的函数副本,波内尔的方法就会起作用


修改函数以获取父对象和方法可能更好,这样它就可以与任何函数一起工作。

即使添加父属性也不会在所有情况下都起作用,因为如果函数位于对象的原型中,则函数对象只有一个副本,因此无法区分它来自哪个实例。下面是一个示例来说明问题:

var b = function ( method ) {
  // parent = this;
};
b.call( A, A.x );
现在,a.x.parent和b.x.parent都设置为b

@只要每个对象都有自己的函数副本,波内尔的方法就会起作用

最好是修改函数以获取父对象和方法,这样它就可以处理任何函数