javascript中的新运算符和对象

new-operator and object in javascript

本文关键字:对象 运算符 javascript      更新时间:2023-09-26

在第(B)行中,Grab()-(A)-对象的方法在接受参数后执行

new sg.SelectionTarget().

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

在第(C)行中,创建了另一个对象。如果第一个问题的答案是"sg-instance",那么第(C)行中介于"("answers"."之间的变量"screenggrab"是什么意思;在第(C)行中新建的sg实例,还是在第(A)行中最初创建的sg对象?

// 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()。您并不是在创建整个谷歌地图命名空间的新实例,只是Marker或Map的实例。

Q2

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

根据评论更新:

您可以直接使用方法,因为this将绑定到父对象(sg/screengrab)。因此调用screengrab.SelectionTarget()将设置screengrab.contentBrowser。话虽如此,this很容易出现问题,因为它不是你想象的那样!

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

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

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

创建对象

可以通过三种方式创建对象。但是,在根中,无论是显式还是隐式,始终使用new运算符。

  1. 通过{}[]构造,它们是new Objectnew 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();

在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