[英]How to access attribute of an inner object in javascript object
这是我的代码:
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']
访问该属性,但这也不起作用。
由于将函数用作构造函数,因此必须将实体设置为属性,而不是伪私有变量。 如果打算大量使用这些taskRepos,则可以将这两种方法移至原型。
function TaskRepository () {
this.entity = {
'startTime': 900,
'endTime': 1830
};
this.setStartTime = function(sTime){
this.entity.startTime = sTime;
};
this.getStartTime = function(){
return this.entity.startTime;
};
}
要么
function TaskRepository () {
this.entity = {
'startTime': 900,
'endTime': 1830
};
}
TaskRepository.prototype = {
'setStartTime' : function(sTime) {
this.entity.startTime = sTime;
},
'getStartTime' : function(){
return this.entity.startTime;
}
};
var x= new TaskRepository();
X是TaskRepository的实例。
var self = this;
Self是X(TaskRepository的实例)中引用该实例的局部变量。
var entity = {
'startTime': 900,
'endTime': 1830
};
实体是实例中的本地变量,与实例无关,因此您无法使用实例访问它。
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;
};
}
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
的对象初始化程序中,属性名称上的单引号是不必要的。 无害,但不必要。
@Shilly的答案很好,但是可以使entity
变量公开。 如果您想将其设为私有,只需使用您的代码,然后通过self
删除对entity
的引用:
function TaskRepository () {
var entity = {
'startTime': 900,
'endTime': 1830
};
this.setStartTime = function(sTime){
entity.startTime = sTime;
};
this.getStartTime = function(){
return entity.startTime;
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.