Как заставить функцию выставлять свои объекты и методы-члены, используя RequireJS AMD

1

Может ли кто-нибудь объяснить мне, что процесс, связанный с функцией, выставляет свои объекты и методы-члены другому объекту с использованием RequireJS AMD? Например, у меня есть следующее в hello.js

define(['jquery','student'], function($,stu){
    var sayHello = function(){
        var post = $('#post').html();
        post.html('Hello, student!');
        post.html(post+stu.name.full());
    };
});

define('student',function(){
    var st = function(){};
    st.name = {
        first: 'Johnny',
        middle: 'Jay',
        last: 'Dabby',
        full: function(){
            return (st.name.first + ' '+ st.name.middle + ' '+st.name.last);
        }
    };
    st.course = {
        math: 'Algebra II',
        science: 'Chemistry',
        social_sci: 'World History',
        foreign_lang: 'French',
        getCourse: function(){
             return st.course.math;
        }
    };
    st.activity = {
        study: '1.5 hrs',
        homework: '0.55 hrs',
        break: '1.0 hr',
        extraCurricula: '0.50 hrs',
        getActivity: function(){
            return st.activity.homework;
        }
    };
    return st;
});

Я пытаюсь интегрировать этот пример или что-то подобное ему в большое приложение, однако отладчик продолжал метать "TypeError", говоря, что stu.name.full не является функцией. Может ли кто-нибудь объяснить, что мне нужно, чтобы исправить стиль кодирования?

Теги:
requirejs
amd

2 ответа

1

Вы должны решить, либо сделать st класс и создать экземпляр из него, или просто сделать st пространства имен Object и использовать его.

Самое простое решение - заменить var st = function(){} на var st = {}.

define('student',function(){
    var st = {};
    st.name = {
        first: 'Johnny',
        middle: 'Jay',
        last: 'Dabby',
        full: function(){
            return (st.name.first + ' '+ st.name.middle + ' '+st.name.last);
        }
    };
    st.course = {
        math: 'Algebra II',
        science: 'Chemistry',
        social_sci: 'World History',
        foreign_lang: 'French',
        getCourse: function(){
             return st.course.math;
        }
    };
    st.activity = {
        study: '1.5 hrs',
        homework: '0.55 hrs',
        break: '1.0 hr',
        extraCurricula: '0.50 hrs',
        getActivity: function(){
            return st.activity.homework;
        }
    };
    return st;
});
  • 0
    Кристи, спасибо. Ошибка устранена. Действительно ценю это.
-1
  1. В hello.js вы ничего не возвращаете из модуля. Вся цель модуля заключается в повторном использовании модуля в другой части приложения. Итак, я бы предложил вернуть объект, который определяет модуль. Что-то вроде..

Hello.js

define(['jquery','student'], function($,stu){
        var sayHello = function(){
            var post = $('#post').html();
            post.html('Hello, student!');
            post.html(post+stu.name.full());
        };
      return { 
             publicHello : sayHello
         };
    });
  1. В вашем Student модуле вы определяете свойства function student а не объект- student. Итак, вам нужно сначала определить пустой объект с выражением, например var st = {}; а затем добавьте свойства, которые вы хотите открыть из этого модуля. В конце вы возвращаете литерал st Object, который возвращает этот модуль. Кроме того, обратите внимание, что name является внутренним свойством function и возвращает имя функции.

Student.js

define('student',function(){
    var st = {};
    st.name = {
        first: 'Johnny',
        middle: 'Jay',
        last: 'Dabby',
        full: function(){
            return (st.name.first + ' '+ st.name.middle + ' '+st.name.last);
        }
    };
    st.course = {
        math: 'Algebra II',
        science: 'Chemistry',
        social_sci: 'World History',
        foreign_lang: 'French',
        getCourse: function(){
             return st.course.math;
        }
    };
    st.activity = {
        study: '1.5 hrs',
        homework: '0.55 hrs',
        break: '1.0 hr',
        extraCurricula: '0.50 hrs',
        getActivity: function(){
            return st.activity.homework;
        }
    };
    return st;
    });

Почему вы получаете ошибку "TypeError", говоря, что stu.name.full не является функцией?

Когда JS-движок запускает оператор кода var st = function(){}; он создает st функцию. Каждая functions получает определенные предопределенные свойства из прототипа функции, такого как name, length, arguments.

Когда вы пытаетесь создать свойство name, как показано ниже, оно пытается переопределить свойство name функции с новым литералом Object. Однако свойство name функции недоступно для записи, поэтому его нельзя изменить. Итак, в основном, приведенный ниже код фактически ничего не делает, и все же st.name будет иметь значение st даже после выполнения приведенного ниже оператора.

Теперь, когда вы используете модуль студента в Hello.js, экспортируемый модуль указывает на функцию st а st.name имеет значение st. Используя код, как stu.name.full() на самом деле вызов функции, которая не существует, и не существует никакого свойства имени полных на name. Следовательно, вы получаете Type error.

st.name = {
        first: 'Johnny',
        middle: 'Jay',
        last: 'Dabby',
        full: function(){
            return (st.name.first + ' '+ st.name.middle + ' '+st.name.last);
        }
    };

Предлагается использовать строгий режим, используя "use strict", чтобы позволить JS-движку выкидывать ошибку при указании какой-либо недопустимой операции.

"use strict";

var st = function(){};
st.name = {};
  • 0
    Агало, спасибо. Ошибка устранена. Действительно ценю это.
  • 0
    @Didum - рад, что помог. Пожалуйста, не забывайте голосовать, пометьте как ответ, если это помогло вам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню