javascript继承,反射和原型链走?

时间:2011-10-09 20:05:53

标签: javascript inheritance reflection constructor prototype-programming

我正在试图弄清楚我可以使用多少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

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

目标是创建一个系统,给定来自Tree实例的节点,可以自行分析其自己的属性继承路径,并识别属性定义的级别。

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:5)

你想建立原型链。

所以让我们说你的继承链是

foo - >吧 - > MOO。

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

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

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

答案 1 :(得分:3)

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));
}