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

时间:2015-09-04 07:56:09

标签: javascript

这是我的代码:

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']访问该属性,但这也无效。

4 个答案:

答案 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)

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

function TaskRepository () {

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

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

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