var A = {
x : function () { }
};
var b = function (method) {
//want to know method's "parent" here
};
b(A.x);
我想知道当我调用b(A.x)时,x在A中定义。这可能吗?
答案 0 :(得分:4)
没有很好的内置方法可以做到这一点,因为实际上Javascript中没有方法。它们是恰好恰好在某处分配的独立Function对象。
如果你每次创建新的函数实例(例如闭包) [感谢Matthew Crumley指出那个] ,那么你可以修改函数对象以明确地将它与它的父对象关联:
x.parent = A;
然后你可以正确地调用它,就好像它是一个方法:
x.call(x.parent);
否则你必须传递函数及其父对象。
答案 1 :(得分:2)
这个问题从语言的角度来看没什么意义,因为许多对象上可能存在一个函数。
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
您可以使用您想要的任何上下文调用x
函数:
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 );
然而,没有任何方法可以从函数内部知道它被分配给哪个对象,因为这不一定是一个地方。
答案 2 :(得分:2)
即使添加父属性也不会在所有情况下都有效,因为如果函数在对象的原型中,则只有一个函数对象的副本,因此无法分辨它来自哪个实例。以下是显示问题的示例:
function MyClass() {
// Create a MyClass object
}
MyClass.prototype.x = function() { return 42; };
var a = new MyClass();
a.x.parent = a; // Set the parent to a
var b = new MyClass();
b.x.parent = b; // b.x and a.x both reference the same function from MyClass.prototype
现在,a.x.parent
和b.x.parent
都设置为b。
@ porneL的方法就会起作用。
最好修改函数以获取父对象和方法,以便它可以与任何函数一起使用。
答案 3 :(得分:0)
Every function in JavaScript is actually a Function object.
<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>