在行(B)中,Grab() - 接受参数后执行(A) - 对象的方法
new sg.SelectionTarget().
使用此“new”关键字,将创建另一个对象。是另一个sg实例,还是同一个sg对象中的另一个SelectionTarget()成员函数?
在行(C)中,创建另一个对象。如果第一个问题的答案是“sg instance”,那么“screengrab” - 在行(C)中的“(”和“。”之间的变量是什么意思;最初在行(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)
答案 0 :(得分:3)
Q1
您正在创建sg.SelectionTarget
而不是sg
的新实例。这是命名空间。例如,如果您要查看Google Maps JavaScript API,您会看到许多内容,例如new google.maps.Marker()
和new google.maps.Map()
。您不是创建整个Google地图命名空间的新实例,只是标记或地图。
Q2
您的sg
和screengrab
变量引用相同的内容。
根据评论更新:
您可以直接使用您的方法,因为this
将绑定到您的父对象(sg
/ screengrab
)。因此,调用screengrab.SelectionTarget()
会设置screengrab.contentBrowser
。话虽这么说,但this
之外的其他问题很容易解决问题!
这个小提琴直接使用会员:http://jsfiddle.net/pUSmD/1/
另一点:构造函数是唯一应该以大写字母开头的函数。如果您不打算创建它们的实例,请使用小写字母开始名称。即。 screengrab.SelectionTarget
- > screengrab.selectionTarget
答案 1 :(得分:0)
当您使用 new 关键字时,通过调用您之后指定的函数来创建对象的新实例。在您的情况下,该对象由SelectionTarget()函数创建,并具有1个成员[object] .contentBrowser。 sg 不会保留对 sg 成员函数创建的新对象的任何引用。
答案 2 :(得分:0)
可以通过三种方式创建对象。但是,在根目录中,始终显式或隐式使用new
运算符。
{}
或[]
构造,这是new Object
和new Array
new
运营商。这可能是显而易见的,也可能发生在函数内部。例如,
function foo(){
// Create and return a new object
return new Array();
}
// a is now an instance of Array
var a = foo();
在5之前的ECMAScript版本中,除了这三种情况之一外,没有其他方法可以创建新的。 (例外情况是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