我正在试图弄清楚我可以使用多少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属性可以确定多少,以及需要自定义实现多少?
我不确定这是否足够清楚,所以请询问任何澄清。
谢谢!
答案 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));
}