我在JavaScript代码的某个点上有一个变量。现在我想获得声明该变量的函数(aka范围)的名称。因此,例如,如果该变量是一个对象的字段,我想得到对象类型的名称。
请考虑以下代码:
function MyClass() {
this.name = "MyName";
this.age = 20;
}
var myVariable = new window.MyClass();
alert(getDeclaringScope(myVariable)) // should alert 'window'
alert(getDeclaringScope(myVariable.name)) // should alert 'MyClass
有没有办法实现getDeclaringScope
功能?
更新
我想使用这样的技术来访问一种“静态”变量,其中存储了用于knockoutjs observable的元信息。一个极其简化的例子:
var META = {};
META["MyClass"] = {};
META["MyClass"]["MyArray"] = { ElementType: "MyOtherClass" };
function MyClass() {
this.MyArray = ko.observableArray();
}
function MyOtherClass() {
this.name = "a";
}
ko.observableArray.fn.addFromPlainObjects = function(plainItems) {
var elemType = .... here I wanted to get "MyOtherClass" from the META global variable
// create MyOtherClass and map the plain items to it... etc.
}
答案 0 :(得分:0)
您可以使用instanceof和构造函数:
例如
myVariable instanceof MyClass; //true
myVariable.constructor;
// returns
function MyClass() {
this.name = "MyName";
this.age = 20;
}
答案 1 :(得分:0)
没有
该对象具有对其构造函数的引用,但构造函数可以从许多对象引用,在这种情况下不仅仅是window
。可以使用变量(而不是属性)直接访问它:
var MyClass = window.MyClass;
var foo = new MyClass();
您可以在对象模型中显式创建反向引用,因为构造函数是对象。
window.MyClass.backref = window;
虽然这很可能不是你想要的。我怀疑你对变量的范围有误解;变量范围与对象属性无关。因此,没有概念声明范围"表示从中检索变量引用的对象和对象属性,因为您似乎将其概念化。