Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript继承、反射和原型链遍历?_Javascript_Inheritance_Reflection_Constructor_Prototype Programming - Fatal编程技术网

javascript继承、反射和原型链遍历?

javascript继承、反射和原型链遍历?,javascript,inheritance,reflection,constructor,prototype-programming,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

我试图弄清楚我能在多大程度上使用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结构中构造。在构建每个节点时,它将使用“继承的”属性模式和myBar结构本身中定义的节点的任何非默认属性,从代码中组合方法

我们的目标是创建一个系统,在给定树实例中的一个节点时,该系统可以自分析其自身的属性继承路径,并确定在哪个级别定义属性

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

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

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


谢谢

您希望构建原型链

那么让我们假设你的继承链是

foo->bar->moo

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

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

var Bar=Object.create(Foo,props)

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

然后对
Moo

var Moo=Object.create(酒吧、道具)

现在假设你有一个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

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

myBar->myUgh->myBar
你的结构看起来是圆形的,你能把你的结构弄清楚吗。