Может ли кто-нибудь объяснить мне, что процесс, связанный с функцией, выставляет свои объекты и методы-члены другому объекту с использованием 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
пространства имен 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;
});
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
модуле вы определяете свойства 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 = {};