Когда создается новый класс, он расширяется новыми свойствами. Из переданных, в качестве второго и последующих аргументов-объектов копируются свойства в прототип нового класса. Но перед тем как сохранить свойство, делается проверка — нет ли уже такого свойства в прототипе. Если значение есть и оно имеет метод __extend__, то вызывается этот метод, которому передается новое значение для прототипа, а в прототип сохраняется результат выполнения этого метода. В противном случае значение копируется в прототип как есть. Этот алгоритм иллюстрирует следующий код:
for (var key in extension) { var curValue = newClass.prototype[key]; newClass.prototype[key] = curValue && curValue.__extend__ ? curValue.__extend__(extension[key]) : extension[key]; }
Та же логика используется при создании экземпляра класса с авто-расширением, только свойства копируются в сам экземпляр, а не в прототип.
Такое поведение позволяет сокращать количество кода при наследовании классов и создании экземпляров, делая код более простым и читаемым.
Например, все классы созданные basis.Create имеют метод __extend__. Если ему передать в качестве аргумента объект или функцию (не "класс"), то будет создан и возвращен новый класс унаследованный от того, у которого был вызван метод. В противном случае метод вернет то значение, что ему передали. Пример:
// создание класса, у которого в качестве // свойства childClass другой класс var MyClass = SomeClass.subclass({ childClass: ChildClass }); // явное создание класса var obj = new MyClass({ childClass: ChildClass.subclass({ ... }) }); // эквивалентная запись, неявное создание класса var obj = new MyClass({ childClass: { ... } });