javascript中的新运算符和对象
在(B)行中,在接受参数后,执行(A)对象的Grab()方法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.
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