我正试图弄清楚我可以使用多少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
Tree对象的实例将从myBar结构体构造。当构建每个节点时,它将使用myBar结构本身中定义的"继承"属性模式和任何来自节点的非默认属性来组合代码中的方法。
目标是创建一个系统,给定Tree实例中的一个节点,该系统可以自分析其自己的属性继承路径并识别在哪个级别定义该属性。
允许编辑myBar结构,并指出哪些属性作为默认值从基本模式(以及在哪个级别)继承,哪些属性在myBar结构中显式定义。
问题是,使用JS递归分析。constructor和。prototype属性可以确定多少,有多少需要自定义实现?
我不确定这是否足够清楚,所以请要求任何澄清。
谢谢!
你想要构建原型链。
假设你的继承链是
foo -> bar -> moo.
然后你有一个对象Foo
,它是你的foo节点的原型。
您可以通过简单地将Foo
注入到它的原型链中来创建Bar
对象。
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));
}
现在你可能面临的一个问题是,原型链中的对象没有元数据告诉你对象是什么,所以你可能想要添加一个属性"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
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));
}