Вызов функции «супер» объекта JavaScript - PullRequest
1 голос
/ 03 июля 2010

У меня есть структура / иерархия объектов, подобная приведенной ниже:


var obj = {

    dimensions : {

        x : 100,
        y : 100,
        w : 300,
        h : 400,
        cmp : function () {

            return this.x + this.y;

        }

    },

    definition : {

        base : {

            rect1 : {

              // how do I get the value of dimensions.x ??
              // or, for that matter, is there a way I could call dimensions.cmp()?


            },

            rect2 : {
                // things go here
            }

        }

    }

};

 

Мой вопрос: возможно ли получить значение dimension.x из функции sizes.definition.rect1?

Ответы [ 3 ]

1 голос
/ 12 июля 2012

Прекратите использование литералов объектов, когда вы хотите что-то подобное:

var obj = new myConstructor();


function myConstructor(){
    var dimensions = {

        x : 100,
        y : 100,
        w : 300,
        h : 400,
        cmp : function () {

            return this.x + this.y;

        }

    };

    this.definition = {

        base : {

            rect1 : {

              // how do I get the value of dimensions.x ??
              // or, for that matter, is there a way I could call dimensions.cmp()?

              //Dimensions is like a private var now - in scope for the object.

              dimensions.cmp(); //that's how you'd call it.
            },

            rect2 : {
                // things go here
            }

        }

    }

}

Постарайтесь представить объекты JS, созданные из конструктора, просто функциями, которые забыли закрыть и собрать мусор. Все локальные переменные зависают и доступны для открытых методов, которые вы определяете внутри конструктора. Внешне определенные методы, как прототипные, так и просто привязанные. однако не будет иметь доступа к размерам. Когда вы делаете это таким образом, думайте о var как о частном и так. как общедоступный. Но ваши публичные методы, определенные внутри функции, могут обращаться к содержимому var.

0 голосов
/ 03 июля 2010

Я не совсем уверен, что вы пытаетесь достичь, но если вы пытаетесь создать несколько экземпляров этого типа объекта, вы можете попробовать что-то вроде этого:

function Structure() {
  this.dimensions = {
    x: 100,
    y: 100,
    w: 300,
    h: 400
  };
  function Rect(dimensions) {
    this.dimensions = dimensions;
    this.func = function() {
      alert(dimensions.x);
    }
  }
  this.definition = {
    base: {}
  };
  this.addRect = function(name) {
    this.definition.base[name] = new Rect(this.dimensions);
  };
};

var obj = new Structure();
obj.addRect('rect1');
obj.addRect('rect2');
obj.definition.base.rect1.func();
0 голосов
/ 03 июля 2010

Вы не можете сделать это динамически, значение this внутри функции будет указывать на объект, где функция связана как свойство.

Например, если вы вызываете foo.bar.func();,значение this внутри func будет относиться к объекту foo.bar, невозможно динамически определить, принадлежит ли this к foo, без явной проверки всех свойств foo (и, конечно, заранее знать заранее)где проверить).

Помните, что объекты обрабатываются как ссылки, поэтому на объект можно ссылаться из разных мест.

Не усложняйте себя, найдите своих членов, используя ссылку obj, будь проще:

var obj = {
  dimensions : {
    x : 100,
    y : 100,
    //...
    cmp : function () {
      return this.x + this.y;
    }
  },
  definition : {
    base : {
      rect1 : {
       foo: function () {
        obj.dimensions.cmp();
        alert(obj.dimensions.x);
        }
      }
      //...
    }
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...