javascript中的new-operator和object

时间:2013-08-01 07:02:49

标签: javascript object new-operator

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

3 个答案:

答案 0 :(得分:3)

Q1

您正在创建sg.SelectionTarget而不是sg的新实例。这是命名空间。例如,如果您要查看Google Maps JavaScript API,您会看到许多内容,例如new google.maps.Marker()new google.maps.Map()。您不是创建整个Google地图命名空间的新实例,只是标记或地图。

Q2

您的sgscreengrab变量引用相同的内容。

根据评论更新:

您可以直接使用您的方法,因为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运算符。

  1. 通过{}[]构造,这是new Objectnew Array
  2. 的简写
  3. 通过new运营商。
  4. 显式调用通过上面的方法1或2创建新对象的函数
  5. 这可能是显而易见的,也可能发生在函数内部。例如,

    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