2017-01-17 1 views
2

Я пытаюсь передать объект формы модели easelJS в качестве параметра в MooTools new Class object, а затем получаю ошибку Maximum call stack size exceeded.MooTools Класс setOptions: Максимальный размер стека вызовов exeeced

Это прекрасно работает в моем классе код:

initialize: function(options){ 
    this.options = options; 
} 

Но это приводит к ошибке:

initialize: function(options){ 
    this.setOptions(options); 
} 

Что плохого в этом? setOptions обычно работает нормально, но в этом случае нет. Что-то не так, как MooTools class->setOptions обрабатывает входные параметры?

В моем примере:

options = {"target": {easelShapeobject}} 
+0

Обратите внимание, что 'options = {" target ": {easelShapeobject}}' недействителен sintax. Это должно быть 'options = {" target ": easelShapeobject}'. Если ошибка является опечаткой в ​​вопросе, вы можете показать реальный код, который используете? – Sergio

+0

Моя ошибка. Это было плохо представлено, и мой синтаксис был буквально неправильным. Я имел в виду, что {easelShapeobject} фактически является объектом {}, а типом этого объекта является easelShapeObject. – XorGate

+0

Я решил это как-то, но я не доволен этим. Я переместил одну строку «container.addChild (elem)» в конец моей функции, и она отлично работала. Я считаю, что это специальное решение, и главная проблема кроется. Я считаю, что MooTools setOptions-function вызывает эту ошибку. Он не может обрабатывать сложные объекты. – XorGate

ответ

0

иметь в виду, что setOptions полагается на Object.merge скопировать реквизита - но если значение другой объект, он становится рекурсивным.

https://github.com/mootools/mootools-core/blob/master/Source/Core/Core.js#L385-L407

, если вы передаете easeljs экземпляр (не уверен на API), это будет объект, и он может попытаться следовать, что через и слияния/клон, пока он не закончит и т.д. - это не очень хорошая модель для использования, поскольку у вас появятся новые объекты, у которых нет правильных конструкторов.

Передайте мольберт в качестве аргумента вне параметров.

new Class({ 
    implement: [Options], 
    initialize: function(options, target){ 
    this.setOptions(options); 
    this.target = target || new createjs.Shape({..some default options}); 
    } 
}) 

Вы сохраняете ссылку, но не разрушаете прото-цепь. если цель не определена, вы можете указать способ по умолчанию для ее создания.

В контексте этого, может быть элемент может быть easeljs.Stage() или идентификатор объекта холста и т.д., чтобы использовать

TL; DR setOptions не должен иметь дело с не-примитивными значениями. та же проблема будет видна через native Object.assign или _.merge/_.clone и т. д.

+0

Да, это именно то, что я наконец сделал. Я отделил цель от параметров, и я передаю ее как еще один параметр. – XorGate

Смежные вопросы