我有一個關於如何從面向對象的角度來處理特定問題的概念性問題(注意:對於那些對這裏的命名空間感興趣的人,我正在使用Google Closure)。我對OOP JS遊戲相當陌生,所以任何和所有的見解都很有幫助!面向對象的Javascript和多個DOM元素
想象一下,您想創建一個對象,該對象爲頁面上的每個DOM元素啓動輪播,該類型與類名.carouselClassName
相匹配。
像這樣的事情
/*
* Carousel constructor
*
* @param {className}: Class name to match DOM elements against to
* attach event listeners and CSS animations for the carousel.
*/
var carousel = function(className) {
this.className = className;
//get all DOM elements matching className
this.carouselElements = goog.dom.getElementsByClass(this.className);
}
carousel.prototype.animate = function() {
//animation methods here
}
carousel.prototype.startCarousel = function(val, index, array) {
//attach event listeners and delegate to other methods
//note, this doesn't work because this.animate is undefined (why?)
goog.events.listen(val, goog.events.EventType.CLICK, this.animate);
}
//initalize the carousel for each
carousel.prototype.init = function() {
//foreach carousel element found on the page, run startCarousel
//note: this works fine, even calling this.startCarousel which is a method. Why?
goog.dom.array.foreach(this.className, this.startCarousel, carousel);
}
//create a new instance and initialize
var newCarousel = new carousel('carouselClassName');
newCarousel.init();
只是OOP玩弄JS中的第一次,我做了一些意見:
- 在我的構造函數對象定義的屬性(
this.classname
)可通過其他原型對象中的this
操作獲得。 - 在我的構造函數對象或原型中定義的方法無法使用this.methodName(請參閱上面的註釋)。
任何額外的我對待這一意見是絕對歡迎的。
構造函數應該命名爲大寫。 – Bergi 2012-04-19 17:20:50