наследование javascript, отражение и прохождение цепочки прототипов? - PullRequest
0 голосов
/ 10 октября 2011

Я пытаюсь выяснить, насколько я могу использовать сам язык 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.

вопрос в том, сколько можно определить из рекурсивного анализа свойств .constructor и .prototype с использованием JS, и сколько нужно будет реализовать на заказ?

Я не уверен, достаточно ли это ясно, поэтому, пожалуйста, уточните.

спасибо!

Ответы [ 2 ]

5 голосов
/ 10 октября 2011

Вы хотите построить цепочки прототипов.

Итак, допустим, ваша цепочка наследования

foo -> bar -> moo.

Тогда у вас есть объект Foo это ваш прототип для узлов foo.

Вы можете создать Bar объект, просто вставив Foo в его цепочку прототипов.

var Bar = Object.create(Foo, props)

Теперь у нас есть Bar прототип, который является прототипом для стержневых узлов.

Затем вы делаете то же самое для Moo

var Moo = Object.create(Bar, props)

Теперь, скажем, выесть узел Му.

Тогда вы можете просто взять любую собственность, которую вы знаете.Давайте назовем его «prop1» и напишем простую функцию, которая дает вам объект, которому принадлежит свойствосообщая вам, что это за объект, вы можете захотеть добавить свойство "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

3 голосов
/ 15 января 2013

Ответ Райноса великолепен.Мне пришлось немного настроить его, чтобы он работал для объектов, не происходящих от объекта.

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