javascript中的新运算符和对象

javascript中的新运算符和对象,javascript,object,new-operator,Javascript,Object,New Operator,在(B)行中,在接受参数后,执行(A)对象的Grab()方法 new sg.SelectionTarget(). 使用此“new”关键字,将创建另一个对象。这是另一个sg实例,还是同一sg对象中的另一个SelectionTarget()成员函数 在第(C)行中,创建了另一个对象。如果第一个问题的答案是“sg instance”,那么第(C)行中“(”和“.”之间的“屏幕抓图”是什么意思;第(C)行中新创建的sg instance还是第(A)行中最初创建的sg对象 Q1 您正在创建一个新的sg.

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

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

在第(C)行中,创建了另一个对象。如果第一个问题的答案是“sg instance”,那么第(C)行中“(”和“.”之间的“屏幕抓图”是什么意思;第(C)行中新创建的sg instance还是第(A)行中最初创建的sg对象

Q1

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

问题2

您的
sg
屏幕抓图
变量引用的是相同的内容

根据评论更新:

您可以直接使用方法,因为
将绑定到父对象(
sg
/
screengrab
)。因此调用
screengrab.SelectionTarget()
将设置
屏幕抓图。contentBrowser
。也就是说,如果
这个
不是你想象的那样,很容易出现问题

此提琴显示直接使用成员:

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

当您使用new关键字时,将创建一个对象的新实例在您的情况下,该对象由SelectionTarget()函数创建,有1个成员[object].contentBrowser.sg不保留对sg成员函数创建的新对象的任何引用。

创建对象 创建对象有三种方式。但是,在根目录下,始终显式或隐式使用
new
运算符

  • 通过
    {}
    []
    构造,它们是
    新对象
    新数组
  • 通过
    new
    操作员
  • 通过上述方法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版本中,除了这三种情况中的一种之外,没有其他方法可以创建新的函数。(例外是ECMAScript 5支持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 a = SomeFunction()
    var b = SomeObject.SomeFunction()
    
    var a = SomeObject
    var b = SomeObject.SomeProperty
    
    工具书类 如果:

    然后

    但是,如果:

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

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

    var a = new Object()
    var a = new Object
    

    如果是这样的话,我不明白为什么要新建函数的实例。仅仅使用原始对象的原始方法还不够吗?有4个object.obj(1):var screengrab={};,obj(2):var sg=screengrab;,obj(3):第(B)行中的new sg.SelectionTarget(),obj(4):this.contentBrowser=new screengrab.Browser第(C)行,第(C)行的第二个屏幕抓图变量是obj(3)。对吗?我编辑了我的答案以使用更直接的语言。如果还有什么需要澄清的,请告诉我。
    foo does not equal bar
    type of bar is "number"
    type of foo is "object"
    
    var a = new Object()
    var a = new Object