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属性可以确定多少,以及需要自定义实现多少?
我不确定这是否足够清楚,所以请询问任何澄清.
谢谢!
您想构建原型链.
所以,让我们说你的继承链是
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