Javascript 如何让函数使用RequireJS公开其对象和成员方法

Javascript 如何让函数使用RequireJS公开其对象和成员方法,javascript,requirejs,amd,Javascript,Requirejs,Amd,有人能给我解释一下让一个函数使用RequireJS AMD向另一个定义的对象公开其对象和成员方法所涉及的过程吗? 例如,我在hello.js中定义了以下内容 define(['jquery','student'], function($,stu){ var sayHello = function(){ var post = $('#post').html(); post.html('Hello, student!'); post.html(

有人能给我解释一下让一个函数使用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不是一个函数。可以解释一下我需要做什么来纠正编码风格吗

您必须做出决定,要么创建
st
类并从中创建实例,要么创建
st
命名空间
对象并使用它

最简单的修复方法是将
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;
});

您必须做出决定,要么创建
st
一个类并从中创建一个实例,要么创建
st
一个命名空间
对象并使用它

最简单的修复方法是将
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;
});
  • 在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
             };
        });
    
  • Student
    模块中,您正在定义
    Student
    函数
  • 上的属性,而不是
    Student
    对象上的属性。因此,您需要首先用
    var st={}这样的语句定义一个空对象
    然后添加要从此模块公开的属性。最后,返回
    st
    Object文本,这是本模块返回的内容。另外,请注意,
    name
    函数中的一个内部属性,并返回函数名
    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
    函数。每个
    函数
    都从函数原型中获取某些预定义属性,如
    名称
    长度
    参数

    当您尝试创建如下所示的name属性时,它试图用新的对象文字覆盖函数的
    name
    属性。但是,函数
    name
    属性不可写,因此无法更改。因此,基本上,下面的代码实际上没有做任何事情,
    st.name
    的值仍然是
    st
    ,即使在执行下面的语句之后也是如此

    现在,当您在Hello.js中使用student模块时,导出的模块指向一个函数
    st
    ,而
    st.name
    有一个值
    st
    。使用类似于
    stu.name.full()
    的代码实际上是调用不存在的函数,并且
    名称上没有名为full的属性。因此会出现
    类型错误

    st.name = {
            first: 'Johnny',
            middle: 'Jay',
            last: 'Dabby',
            full: function(){
                return (st.name.first + ' '+ st.name.middle + ' '+st.name.last);
            }
        };
    
    建议使用“use strict”的严格模式,以允许JS引擎在指定任何无效操作时抛出错误

    “严格使用”;
    var st=函数(){};
    st.name={}
    
  • 在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
             };
        });
    
  • Student
    模块中,您正在定义
    Student
    函数
  • 上的属性,而不是
    Student
    对象上的属性。因此,您需要首先用
    var st={}这样的语句定义一个空对象
    然后添加要从此模块公开的属性。最后,返回
    st
    Object文本,这是本模块返回的内容。另外,请注意,
    name
    函数中的一个内部属性,并返回函数名
    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
    函数。每个
    函数
    都从函数原型中获取某些预定义属性,如
    名称
    长度
    参数

    当您尝试创建如下所示的name属性时,它试图用新的对象文字覆盖函数的
    name
    属性。但是,函数
    name
    属性不可写,因此无法更改。因此,基本上,下面的代码实际上没有做任何事情,
    st.name
    的值仍然是
    st
    ,即使在执行下面的语句之后也是如此

    现在,当您在Hello.js中使用student模块时,导出的模块指向一个函数
    st
    ,而
    st.name
    有一个值
    st
    。使用类似于
    stu.name.full()
    的代码实际上是调用不存在的函数,并且
    名称上没有名为full的属性。因此会出现
    类型错误

    st.name = {
            first: 'Johnny',
            middle: 'Jay',
            last: 'Dabby',
            full: function(){
                return (st.name.first + ' '+ st.name.middle + ' '+st.name.last);
            }
        };
    
    建议使用“use strict”的严格模式,以允许JS引擎在指定任何无效操作时抛出错误

    “严格使用”;
    var st=函数(){};
    
    st.name={}克里斯蒂,谢谢你。错误问题已经解决。非常感谢,克里斯蒂,谢谢你。错误问题已经解决。非常感谢。阿加洛,谢谢你。错误问题已经解决。真的很感激它。@Didum-很高兴它有帮助。请别忘了投票,如果答案对你有帮助的话,请做标记。阿加洛,谢谢。缺陷问题是resol