【问题标题】:How to determine parent object from reference to a property如何根据对属性的引用确定父对象
【发布时间】:2012-06-18 07:18:40
【问题描述】:
var object = {foo: 'bar'};

JavaScript 是否有办法从传递object.foo 的函数内部确定object.fooobject 的属性?换句话说,是否有可能编写一个可以做到这一点的函数:

getSource(object.foo) === object

【问题讨论】:

  • 你为什么不解释你想要达到的目标,也许你的方式太复杂了
  • @mplungjan 我想做很多事情。
  • @mplungjan 我可以将object 本身传递给一个函数——我想知道是否有可能在不这样做的情况下获取该信息。

标签: javascript object properties


【解决方案1】:

不,在 JavaScript 中没有类似的反向引用。传递给函数的是一个值——5"foo"、对象引用等。没有关于该值的信息告诉您该值来自对象属性,更不用说 which em> 对象的属性。

【讨论】:

  • 谢谢,是的,我很确定这是不可能的——尽管你必须承认,如果有这样的机制会很酷。
  • @ryanve: :-) 这会使底层引擎明显复杂化。
【解决方案2】:

对于变量,Javascript 使用“按值传递”,换句话说,当object.foo 被传递给任何函数时,该函数将收到'bar',而不是对object.foo 的引用:

var object = {foo: 'bar'};
function by_value(v) {
    v = v + v
}
document.write(by_value(object.foo)) // Writes 'bar'

换句话说,一旦您将object.foo 传递给任何函数,就无法知道它来自object

但是,如果您传递一个对象,该变量的 将是该对象的 引用(注意:这不是真的“通过通过引用”,请参阅@t-j-crowder 的评论):

function as_reference(o) {
    o.foo = o.foo + o.foo
}
document.write(by_reference(object)) // Writes 'barbar'

作为一种廉价的解决方法,您也可以在对象中存储对对象的“引用”:

var object = {foo: 'bar'};
object.foo = {val: object.foo, parent: object}
function do_something(v) {
    console.log(v.val);   // foo
    console.log(v.parent) // object
}
do_something(object.foo)

有用吗?

【讨论】:

  • “但是,对于对象,Javscript 使用“引用调用”:“ 。这是不正确的。 JavaScript 总是 值传递。被传递的值可能是一个对象引用,但它仍然是按值传递的。重要的是不要延续这个误导性的神话。考虑:function foo(o) { o = null; }var obj = {};foo(obj);obj 的值是多少?如果 JavaScript 对对象使用传递引用,obj 将是 null。它不是。 pass-by-reference 中的“引用”一词是指对传递的变量的引用;它与对象引用无关。
  • 抱歉,在保存编辑之前回复了您的评论 - 诅咒你,标签式浏览。修改内容现在应该生效了。
  • @Manuel:因为var是关键字,所以不能作为属性名使用点分符号(例如v.var)。我为您将其更改为val。另外强烈建议不要依赖自动分号插入的恐怖。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多