我正在使用JS中的一个相当复杂的对象,并且遇到了问题:

我有以下(节略)代码:

var LocationSelector;

LocationSelector = function(container) {
  this.selectors = {
    container: container,
    city_name: container.find('input.city_name'),
    city_id: container.find('input.city_id')
  };
  return this.initialize();
};

LocationSelector.prototype = {
  initialize: function() {
    return this.city.checkStatus();
  },
  city: {
    status: null,
    message: null,
    id: null,
    checkStatus: function() {
      if (LocationSelector.selectors.city_name.val() && LocationSelector.selectors.city_id.val()) {
        return LocationSelector.city.setStatus('success');
      }
    },
    setStatus: function(status) {
      return alert(status);
    }
  }
};

两个问题:

1)在子对象函数内部this不再引用回根对象。如果我写出LocationSelector.object.method( args ),似乎可以引用父项,但这要输入很多内容。有没有一种方法可以定义返回到父对象的快捷方式?

2)在某些情况下,每页需要几个实例,因此对我来说很重要的一点是,可以在实例化新对象时设置各种selectors,然后在原型(prototype)中引用实例选择器。在子对象方法中引用父对象(即LocationSelector)是否甚至可行? JS如何知道如何保留当前 Activity 对象的存储属性?

基本上,我正在尝试实现一个类,而我对JS还是陌生的,并不真正知道该怎么做。因此,任何帮助或建议,不胜感激。谢谢!

最佳答案

您当前的方法有很多问题。尽管我不明白为什么LocationSelector实例具有city成员,但是这与您想要的东西更接近。

function LocationSelector(container) {
  this.selectors = {
    container: container,
    city_name: container.find("input.city_name"),
    city_id: container.find("input.city_id")
  };

  this.city = new City(this);
  this.city.checkStatus();
}

function City(locationSelector) {
  this.status = null;
  this.message = null;
  this.id = null;
  this.locationSelector = locationSelector;
}

City.prototype.checkStatus = function () {
  if (this.locationSelector.selectors.city_name.val() && this.locationSelector.selectors.city_id.val()) {
    this.setStatus("success");
  }
};

City.prototype.setStatus = function () {
  alert("status");
};

注意事项:
  • 数据属性位于实例上,而不是原型(prototype)上。原型(prototype)上只有方法。
  • City显然是其自己的类,因此您应该使其成为一类。在您的代码中,由于LocationSelector的所有实例都放在原型(prototype)中,因此一个城市正在共享。在此代码中,在LocationSelector构造函数中将其分配为实例属性。
  • 您不能像在示例中一样引用LocationSelector.selectorsLocationSelector.selectors将用于“静态”属性,而LocationSelector没有。相反,您需要在特定实例上引用selectors属性;在此示例中,该实例由this.locationSelector给出。
  • 第2点和第3点说明了一个重要的事实:“子” City实例在没有具体实例的情况下无法引用“父” LocationSelector类的属性。


  • 这是一个对我来说更有意义的代码版本,删除了LocationSelector具有city属性(不使用)的部分。
    function LocationSelectors(container) {
      this.city_name = container.find("input.city_name");
      this.city_id = container.find("input.city_id");
    }
    
    function City(locationSelectors) {
      this.locationSelector = locationSelector;
    }
    
    City.prototype.checkStatus = function () {
      if (this.locationSelectors.city_name.val() && this.locationSelectors.city_id.val()) {
        this.setStatus("success");
      }
    };
    
    City.prototype.setStatus = function () {
      alert("status");
    };
    
    function checkCityStatus(container) {
      var locationSelectors = new LocationSelectors(container);
      var city = new City(locationSelectors);
    
      city.checkStatus();
    }
    

    我为您提供了Crockford's "Private Members in JavaScript"的链接,该链接讨论了使用JavaScript进行OO的方法。还有其他可能更好的解释,但至少可以使您走上正确的道路。

    09-26 06:21