如何在javascript对象中访问内部对象的属性

如何在javascript对象中访问内部对象的属性,javascript,Javascript,这是我的密码: function TaskRepository () { var self = this; var entity = { 'startTime': 900, 'endTime': 1830 }; this.setStartTime = function(sTime){ self.entity.startTime = sTime; }; this.getStartTime = f

这是我的密码:

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']
访问该属性,但这也不起作用。

由于将函数用作构造函数,因此必须将该实体设置为属性,而不是伪私有变量。如果您计划制作大量这些TaskRepo,可以将这两种方法移动到原型中

function TaskRepository () {
    this.entity = {
        'startTime': 900,
        'endTime': 1830
    };
    this.setStartTime = function(sTime){
        this.entity.startTime = sTime;
    };
    this.getStartTime = function(){
        return this.entity.startTime;
    };
}


由于将函数用作构造函数,因此必须将实体设置为属性,而不是伪私有变量。如果您计划制作大量这些TaskRepo,可以将这两种方法移动到原型中

function TaskRepository () {
    this.entity = {
        'startTime': 900,
        'endTime': 1830
    };
    this.setStartTime = function(sTime){
        this.entity.startTime = sTime;
    };
    this.getStartTime = function(){
        return this.entity.startTime;
    };
}

问题描述: 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
    };
编辑以便更好地理解: 问题描述: 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
    };
编辑以便更好地理解:
@Shilly的答案很好,但它会使
实体
变量公开。如果您想将其保密,只需使用您的代码,但通过
self
删除对
实体的引用即可:

function TaskRepository () {

    var entity = {
        'startTime': 900,
        'endTime': 1830
    };

    this.setStartTime = function(sTime){
        entity.startTime = sTime;
    };

    this.getStartTime = function(){
        return entity.startTime;
    };
}

@Shilly的答案很好,但它会使
实体
变量公开。如果您想将其保密,只需使用您的代码,但通过
self
删除对
实体的引用即可:

function TaskRepository () {

    var entity = {
        'startTime': 900,
        'endTime': 1830
    };

    this.setStartTime = function(sTime){
        entity.startTime = sTime;
    };

    this.getStartTime = function(){
        return entity.startTime;
    };
}

实体
不是您正在使用
新建TaskRepository
创建的对象的属性,而是由调用
新建TaskRepository
的上下文保存的局部变量。由于您在该调用期间创建的函数在调用完成后继续存在,因此该上下文保持活动状态,并且您可以继续从这些函数访问它(它们是上下文上的闭包,因此它们使上下文保持活动状态)

由于
实体
不是属性,因此不能通过实例访问它。这是一个变量,你可以直接使用它:

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'
    };
}
函数任务存储库(){

var self=this;//
实体
不是您正在使用
新建TaskRepository
创建的对象的属性,它是一个局部变量,由调用
新建TaskRepository
的上下文持有。由于您在该调用期间创建的函数在调用完成后继续存在,因此该上下文保持活动状态,并且您可以继续从这些函数访问它(它们是上下文上的闭包,因此它们使上下文保持活动状态)

由于
实体
不是一个属性,因此您不能通过实例访问它。它是一个变量,您的函数关闭后,您可以直接使用它:

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'
    };
}
函数任务存储库(){

var-self=this;//您必须删除
self。
为什么您认为
self.entity
将引用
var-entity
?@deceze如果我知道您问题的答案,我不会问它,所以:)使用var声明将生成对象的私有变量以及当前范围的局部变量。因此,您只需它的名字,没有任何类型的前缀。你必须删除
self。
为什么你认为
self.entity
会引用
var entity
?@deceze如果我知道你问题的答案,我就不会这样问了:)用var声明将成为对象的私有变量以及当前范围的局部变量。所以你可以仅使用其名称,不带任何前缀。实体是实例中的局部变量,与实例无关,那么删除
self
如何工作?@Nayan self是对实例的引用。当您尝试访问实体(局部变量)时通过引用的实例。它将不起作用,因为实体不是TaskRepository的属性,而是TaskRepository中的局部变量。您必须了解,变量实体存在于TaskRepository函数中。当您实例化函数时,您仍然可以在实例中使用实体,但无法通过因为实例不是实例的一部分,所以实例变量以thisentity开头,是实例中与实例无关的局部变量,那么删除
self
如何工作?@Nayan self是对实例的引用。当您尝试访问实体(局部变量)时通过引用的实例。它将不起作用,因为实体不是TaskRepository的属性,而是TaskRepository中的局部变量。您必须了解,变量实体存在于TaskRepository函数中。当您实例化函数时,您仍然可以在实例中使用实体,但无法通过因为实例不是实例的一部分。实例变量以此开头非常感谢你的回答。我想保持
实体
为私有谢谢你的回答。我想保持
实体
为私有