【问题标题】:javascript inheritance, reflection and prototype chain walking?javascript继承,反射和原型链行走?
【发布时间】:2011-12-04 02:34:39
【问题描述】:

我试图弄清楚我可以使用多少 javascript 语言本身,以及在对象反射方面我必须自己实现多少。这是预期的结果

// property inheritance schema (defining default props) (stored in db "schemas" table)
foo
    bar
        moo
    baz
        ugh

// method inheritance schema (stored in code)
foo
    bar
        moo
    baz
        ugh

// myTree structure + property overrides (stored in db "structs" table)
myBar
    myBaz
    myUgh
        myBar
    myBaz
        myMoo

一个 Tree 对象的实例将从 myBar 结构构造。在构建每个节点时,它将使用代码中的方法,“继承的”属性架构和 myBar 结构本身中定义的节点的任何非默认属性。

目标是创建一个系统,在给定 Tree 实例的节点的情况下,它可以自我分析其自身的属性继承路径并确定在哪个级别定义了属性。

这是为了允许编辑 myBar 结构并指示哪些属性作为默认值从基本架构(以及在哪个级别)继承,哪些属性在 myBar 结构中明确定义。

问题是,使用 JS 递归分析 .constructor 和 .prototype 属性可以确定多少,需要自定义实现多少?

我不确定这是否足够清楚,所以请寻求任何澄清。

谢谢!

【问题讨论】:

  • myBar -> myUgh -> myBar 你的结构看起来是圆形的,你能让你的结构更清晰吗?

标签: javascript inheritance reflection constructor prototype-programming


【解决方案1】:

您想构建原型链。

假设你的继承链是

foo -> bar -> moo.

然后你有一个对象Foo,它是你的 foo 节点原型。

您只需将Foo 注入其原型链即可创建Bar 对象。

var Bar = Object.create(Foo, props)

现在我们有一个Bar 原型,它是条形节点的原型。

然后你对Moo做同样的事情

var Moo = Object.create(Bar, props)

现在假设你有一个 moo 节点。

然后,您可以简单地获取您知道的任何财产。让我们称之为“prop1”并编写一个简单的函数,为您提供属性所属的对象

var findPropertyOwner = function(obj, prop) {
  do {
    if (obj.hasOwnProperty(prop)) {
      return obj;
    }
  } while (obj = Object.getPrototypeOf(obj));
}

现在您可能面临的问题之一是原型链中的 obj 没有元数据告诉您对象是什么,因此您可能希望将属性 "name" 添加到所有节点原型对象,以便您可以更轻松地检查它是什么。

您可能还想让findPropertyOwner 返回一个(obj, count) 的元组,如下所示

var findPropertyOwner = function(obj, prop) {
  var i = 0;
  do {
    if (obj.hasOwnProperty(prop)) {
      return [obj, i];
    }
  } while (i++, obj = Object.getPrototypeOf(obj));
}

通过这种方式,您可以获得更多信息,例如在原型链中找到该属性的位置。另请注意,当 do/while 循环终止时 (Object.getPrototypeOf(Object.prototype) === null),它将返回 undefined

【讨论】:

    【解决方案2】:

    Raynos 的回答很棒。我不得不稍微调整一下,让它适用于不是 Object 的后代。

    var findPropertyOwner = function(obj, prop) {
      var i = 0;
      do {
        if (Object.prototype.hasOwnProperty.call(obj, prop)) {
          return [obj, i];
        }
      } while (i++, obj = Object.getPrototypeOf(obj));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多