这是我的代码:
function TaskRepository () {
var self = this;
var entity = {
'startTime': 900,
'endTime': 1830
};
this.setStartTime = function(sTime){
self.entity.startTime = sTime;
};
this.getStartTime = function(){
return self.entity.startTime;
};
}
但以下代码无效
var x= new TaskRepository();
x.setStartTime(6);
这里有什么问题?我错过了什么?我还尝试通过self.entity['startTime']
访问该属性,但这也无效。
答案 0 :(得分:5)
由于您将该函数用作构造函数,因此必须将实体设置为属性,而不是伪私有变量。如果您计划进行大量的这些taskRepos,您可以将这两种方法移动到原型。
function TaskRepository () {
this.entity = {
'startTime': 900,
'endTime': 1830
};
this.setStartTime = function(sTime){
this.entity.startTime = sTime;
};
this.getStartTime = function(){
return this.entity.startTime;
};
}
OR
function TaskRepository () {
this.entity = {
'startTime': 900,
'endTime': 1830
};
}
TaskRepository.prototype = {
'setStartTime' : function(sTime) {
this.entity.startTime = sTime;
},
'getStartTime' : function(){
return this.entity.startTime;
}
};
答案 1 :(得分:4)
var x= new TaskRepository();
X是TaskRepository的一个实例。
var self = this;
Self是引用实例的X(TaskRepository实例)中的局部变量。
var entity = {
'startTime': 900,
'endTime': 1830
};
entity是实例中的一个局部变量,与实例无关,因此您无法使用实例访问它..如此处所示。
self.entity.startTime
删除self
(=> entity.startTime
)或执行此操作:
this.entity = {
'startTime': 900,
'endTime': 1830
};
function TaskRepository () {
//THIS refers to the instance of TaskRepository that we named X
//We don't need SELF since we are already within the instance and it's easy to access THIS
//Entity is now part of any TaskRepository instances
this.entity = {
'startTime': 900,
'endTime': 1830
};
this.setStartTime = function(sTime){
//THIS refers to the instance of TaskRepository because we are in a method that is part of the instance (Hint it has THIS.setStartTime)
//To access entity you use the context this
this.entity.startTime = sTime;
};
this.getStartTime = function(){
return this.entity.startTime;
};
}
答案 2 :(得分:2)
entity
不是您使用new TaskRepository
创建的对象的属性,它是由new TaskRepository
调用的上下文保存的局部变量。由于您在调用期间创建的函数在调用完成后继续存在,因此该上下文保持活动状态,您可以继续从这些函数访问它(它们在上下文中是闭包,并且所以他们保持上下文的存在。)
由于entity
不是属性,因此您不通过实例访问它。它是你的函数关闭的变量,你只需直接使用它:
function TaskRepository () {
var self = this; // <=== Unless you use this for something you haven't shown,
// you can remove it
var entity = {
'startTime': 900,
'endTime': 1830
};
this.setStartTime = function(sTime){
entity.startTime = sTime;
// ^---------- no 'self'
};
this.getStartTime = function(){
return entity.startTime;
// ^---------- no 'self'
};
}
每次调用new TaskRepository
都会创建一个新的上下文,因此每个都有自己的entity
副本,因此它最终会特定于该对象,即使它不是该对象的属性。
这是为实例创建“私有”属性的经典方法。
附注:您创建entity
的对象初始值设定项中的属性名称上的单引号是不必要的。无害,但不必要。
答案 3 :(得分:1)
entity
变量公开。如果您想将其保密,只需使用您的代码,但通过entity
删除对self
的引用:
function TaskRepository () {
var entity = {
'startTime': 900,
'endTime': 1830
};
this.setStartTime = function(sTime){
entity.startTime = sTime;
};
this.getStartTime = function(){
return entity.startTime;
};
}