繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM