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

lee*_*iya 0 javascript reflection inheritance 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

谢谢!

Ray*_*nos 5

您想构建原型链.

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

foo - > bar - > 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));
}
Run Code Online (Sandbox Code Playgroud)

现在您可能面临的一个问题是原型链中的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));
}
Run Code Online (Sandbox Code Playgroud)

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