在(B)行中,在接受一个参数之后,执行(A)-object的Grab()方法
new sg.SelectionTarget().
使用此"new"关键字,将创建另一个对象。是同一sg对象中的另一个sg实例,还是另一个SelectionTarget()成员函数?
在(C)行中,创建了另一个对象。如果第一个问题的答案是“sg实例”,则在line(C)中“(”和“。”之间的“screengrab”变量是什么意思;在line(C)或sg对象中新创建的sg实例在(A)行中创建?
// objects
var screengrab = {};
var sg = screengrab;//-----(A)
screengrab.Grab = function(target) {
try {
// (some code)
} catch (error) {
// (some code)
}
}
screengrab.SelectionTarget = function() {
this.contentBrowser = new screengrab.Browser(screengrab
.Browser.contentWindow());------(C)
}
screengrab.Browser = function(win) {
this.win = win;
this.doc = new screengrab.Document(win.document);
this.htmlDoc = win.document;
this.htmlWin = win.content.window;
}
screengrab.Browser.contentWindow = function() {
return window.top.getBrowser().selectedBrowser.contentWindow;
}
// After User's action, this function triggers.
sg.Grab(new sg.SelectionTarget());------(B)
最佳答案
Q1
您正在创建sg.SelectionTarget
而不是sg
的新实例。这是命名空间。例如,如果您要查看Google Maps JavaScript API,则会看到很多类似new google.maps.Marker()
和new google.maps.Map()
的东西。您不是要创建整个Google Maps namespace 的新实例,而只是创建Marker或Map的新实例。
Q2
您的sg
和screengrab
变量引用的是同一件事。
根据评论更新:
您可以直接使用方法,因为this
将绑定(bind)到您的父对象(sg
/ screengrab
)。因此,调用screengrab.SelectionTarget()
将设置screengrab.contentBrowser
。话虽这么说,但很容易陷入this
问题而不是您想像的问题!
该小提琴显示了直接使用成员:http://jsfiddle.net/pUSmD/1/
还有一点:构造函数是唯一应以大写字母开头的函数。如果您不想创建它们的实例,请以小写字母开头。即。 screengrab.SelectionTarget
-> screengrab.selectionTarget