Javascript 如何让函数使用RequireJS公开其对象和成员方法
有人能给我解释一下让一个函数使用RequireJS AMD向另一个定义的对象公开其对象和成员方法所涉及的过程吗? 例如,我在hello.js中定义了以下内容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(
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