我正在使用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");
};
注意事项:
City
显然是其自己的类,因此您应该使其成为一类。在您的代码中,由于LocationSelector
的所有实例都放在原型(prototype)中,因此一个城市正在共享。在此代码中,在LocationSelector
构造函数中将其分配为实例属性。 LocationSelector.selectors
。 LocationSelector.selectors
将用于“静态”属性,而LocationSelector
没有。相反,您需要在特定实例上引用selectors
属性;在此示例中,该实例由this.locationSelector
给出。 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的方法。还有其他可能更好的解释,但至少可以使您走上正确的道路。