在(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

您的sgscreengrab变量引用的是同一件事。

根据评论更新:

您可以直接使用方法,因为this将绑定(bind)到您的父对象(sg / screengrab)。因此,调用screengrab.SelectionTarget()将设置screengrab.contentBrowser。话虽这么说,但很容易陷入this问题而不是您想像的问题!

该小提琴显示了直接使用成员:http://jsfiddle.net/pUSmD/1/

还有一点:构造函数是唯一应以大写字母开头的函数。如果您不想创建它们的实例,请以小写字母开头。即。 screengrab.SelectionTarget-> screengrab.selectionTarget

09-17 12:31