Java の設計パターンに関する知識を Web 開発に適用する方法を理解するために、少し前にこの本を手に取りました。しかし、イントロダクションで奇妙な矛盾に遭遇しました。
作成者は、次のコードは、ユーザーがアニメーション オブジェクトを作成できるようにするクラスを定義していると述べています。
//Anim class
var Anim = function(){ /*code here*/ };
Anim.prototype.start = function(){ /*start code here*/ };
Anim.prototype.stop = function() { /*stop code here */};
//create a new Anim object and call the start method
var newAnim = new Anim();
newAnim.start();
アプリで同様のことを試しました。
//Nucleus class and addLink function
var Nucleus = function(){
this.location=null;
this.links = [];
}
//revamp object and add to link array
Nucleus.prototype.addLink = function(marker){ }
上記のクラスは、グローバル変数としてインスタンス化されました
var curSpot = new Nucleus();
ただし、Firebug は、ページの読み込み時に を示すエラーをスローしNucleus is not a constructor
、Javascript ボタン処理機能が無効になっていました。この問題は、Nucleus
定義を次のように変更することで解決されました
function Nucleus(){ /*instance members here*/ }
OO 機能が動作するようになりました。後者の例は機能するのに、本の例ではエラーがスローされるのはなぜですか?
Ryan Lynch の要請により、追加のコードが投稿されました。これは、1curStop が使用されている唯一のコードです。そのグローバル変数として、
//global variables
var curStop = new Nucleus();
function showMarkers(){
//unreleated code here
var tourList = [];
//handles a double click event, adds current marker to list and creates one
//if not null. Otherwise, create a new Nucleus object and add current location
(function(marker){
google.maps.event.addListener(marker, 'dblclick', function(){
if (curStop != null){
tourList.push(curStop);
curStop = null;
} else {
curStop = new Nucleus();
curStop.addLocation(marker);
}
}); //end listener
})(marker);
}
function postTour(){
//need CurStop to be a global variable, since only new double-click events add the
//object to the tourList array. This makes sure that all objects are saved on
//button click
tourList.push(curStop);
}