3

在 (B) 行中,在接受参数后执行 (A)-object 的 Grab()-method

new sg.SelectionTarget().

使用这个“new”关键字,会创建另一个对象。那是另一个 sg 实例,还是同一个 sg 对象中的另一个 SelectionTarget() 成员函数?

在行 (C) 中,创建了另一个对象。如果第一个问题的答案是“sg instance”,那么“screengrab”-line(C)中“(”和“.”之间的变量是什么意思;在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)
4

3 回答 3

3

第一季度

您正在创建sg.SelectionTargetnot of的新实例sg。这是命名空间。例如,如果您查看 Google Maps JavaScript API,您会看到很多类似new google.maps.Marker()new google.maps.Map(). 您不会创建整个 google maps 命名空间的新实例,而只是创建 Marker 或 Map 的实例。

第二季度

你的sgscreengrab变量引用的是同一个东西。

根据评论更新:

您可以直接使用您的方法,因为this将绑定到您的父对象(sg/ screengrab)。所以调用screengrab.SelectionTarget()将设置screengrab.contentBrowser。话虽如此,很容易陷入与this您想象的不同的问题!

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

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

于 2013-08-01T07:17:27.227 回答
0

创建对象

可以通过三种方式创建对象。但是,从根本上说,new运算符总是被显式或隐式地使用。

  1. 通过{}or[]结构,它们是new Objectand的简写new Array
  2. 通过new运营商。
  3. 通过上面的方法 1 或 2 显式调用创建新对象的函数

这可能很明显,或者发生在函数内部。例如,

function foo(){
    // Create and return a new object
    return new Array();
}

// a is now an instance of Array
var a = foo();

在 ECMAScript 5 之前的版本中,除了这三种情况之一之外,没有其他方法可以创建新的。(例外是 ECMAScript5 支持 getter/setter,它们是内部函数,但看起来像属性访问。在大多数代码中你不应该期望这一点。)

所以这些将创建一个新对象:

var a = new Object();
var b = {}
var c = new SomeFunction()
var d = new SomeObject.SomeFunction()

这些可能会创建一个新对象

var a = SomeFunction()
var b = SomeObject.SomeFunction()

这些不会创建新对象

var a = SomeObject
var b = SomeObject.SomeProperty

参考

如果:

var foo = {a:1, b:2};
var bar = foo;
bar.a = 3;

然后

foo.a is equal to 3
foo is equal to bar

但是,如果:

var foo = {a:1, b:2};
var bar = foo;
bar = 1;  // changing value of a variable, not a property

然后

foo does not equal bar
type of bar is "number"
type of foo is "object"

笔记

对于new运算符,您可以使用括号。以下两行是等效的。

var a = new Object()
var a = new Object
于 2013-08-01T07:24:36.320 回答
0

当您使用new关键字时,通过调用您在其后指定的函数来创建对象的新实例。在您的情况下,该对象由 SelectionTarget() 函数创建,并具有 1 个成员 [object].contentBrowser。sg不保留对由sg的成员函数创建的新对象的任何引用。

于 2013-08-01T07:21:28.660 回答