如何在Javascript中找到属性的所有者
好的,因为我最初的问题听起来不清楚,所以我决定编辑它。我的问题是,如何找出谁定义了某个属性,例如,如何在Javascript中找到属性的所有者,javascript,properties,Javascript,Properties,好的,因为我最初的问题听起来不清楚,所以我决定编辑它。我的问题是,如何找出谁定义了某个属性,例如,parseInt函数,如何知道它是在哪个对象上定义的,就像parseInt是在窗口对象或文档对象或任何对象上定义的一样?多谢各位 我知道parseInt被定义为window对象,我只是把它作为一个一般的例子,我不是特别问是什么对象定义了parseInt属性 另外,请不要向我展示jQuery代码,因为我对jQuery不太了解。不幸的是,无法使用代码确定给定变量的变量环境是什么 至于对象属性,如果它们是
parseInt
函数,如何知道它是在哪个对象上定义的,就像parseInt
是在窗口
对象或文档
对象或任何对象上定义的一样?多谢各位
我知道parseInt
被定义为window
对象,我只是把它作为一个一般的例子,我不是特别问是什么对象定义了parseInt
属性
另外,请不要向我展示jQuery代码,因为我对jQuery不太了解。不幸的是,无法使用代码确定给定变量的变量环境是什么 至于对象属性,如果它们是
myObj.property
,则它们应该是显而易见的。如果不明显,可以使用穷举搜索来查找它们在某些地方的存在,或者递归地查找某些已知的存在
总的来说,不看实现文档就不可能知道。我知道要解决我的问题,我们可以使用
Object.prototype.hasOwnProperty()
,但这将是非常多的键入操作,因为每次需要知道对象上是否定义了某个属性时,您都必须键入它。我已经决定写我自己的函数,使它更容易,即使这是没有很好的实际用途,我只是想满足我的好奇心
function findOwner(property, ownerObjectArray) {
var result = []; // Array to store the objects that the given property is defined on
for (var i = 1; i < arguments.length; i++)
{
var obj = arguments[i]; // the object currently being inspected
var properyList= Object.getOwnPropertyNames(arguments[i]); // a list of all "Owned" properties by this object
for (var j = 0; j < properyList.length; j++)
{
if (property === properyList[j]) result.push(obj.constructor);
}
}
return result.length > 0 ? result : "undefinded";
}
属性在JavaScript中不是“所有的”。我的意思是,谁定义了属性,它基本上是由该对象所有的。
parseInt
函数是一个值,而不是一个属性。parseInt
标识符是window
对象的一个属性。@Alex,它不是全局变量,它是全局对象的一个成员。@Dummy在实践中如何应用此信息?也就是说,是否有一个实际的例子,您需要知道在什么对象中定义了某些属性?ECMAScript规范规定,parseInt
是根全局
对象的属性。它的函数定义通常是内置的,但如果需要,可以通过脚本重写。假设您可以通过递归搜索属性树来搜索相同的函数属性引用,但这不会告诉您任何有意义的信息。@Dai-Yup,同意所有这些:)不,我通常使用parseInt
作为示例,我知道parseInt
函数是在窗口
对象上定义的。但是我想知道你怎么才能找到谁定义了某个属性呢?谢谢你让我知道这是不可能的,至少我不必再去寻找答案了。但如果有可能,那就太好了。“不幸的是,无法使用代码确定给定变量的变量环境是什么”。对ECMAScript规范没有提供任何方法来引用“变量对象”,例如,迭代属性并查找特定执行上下文中的所有变量。如果你做不到这一点,你就无法在一个上下文中找到所有的对象,因此也无法迭代找到它们的所有属性(对象可以是“匿名的”,就像函数一样)。;-)
window.onload = run;
function run()
{
alert(findOwner("parseInt", Array.prototype, window, document)); // passing 3 objects we want to test against to this method. It printed : [object Window], the given property "parseInt" was found on the "Window" object
}