javascript中的新运算符和对象
new-operator and object in javascript
在第(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
您的sg
和screengrab
变量引用的内容相同。
根据评论更新:
您可以直接使用方法,因为this
将绑定到父对象(sg
/screengrab
)。因此调用screengrab.SelectionTarget()
将设置screengrab.contentBrowser
。话虽如此,this
很容易出现问题,因为它不是你想象的那样!
此小提琴显示直接使用成员:http://jsfiddle.net/pUSmD/1/
另一点:构造函数是唯一应该以大写字母开头的函数。如果您不打算创建它们的实例,请以小写字母开头。即screengrab.SelectionTarget
->screengrab.selectionTarget
当您使用new关键字时,会通过调用后面指定的函数来创建对象的新实例。在您的情况下,该对象是由SelectionTarget()函数创建的,并且有一个成员[object].contentBrowser。sg不会保留对sg成员函数创建的新对象的任何引用。
创建对象
可以通过三种方式创建对象。但是,在根中,无论是显式还是隐式,始终使用new
运算符。
- 通过
{}
或[]
构造,它们是new Object
和new Array
的简写 - 通过
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版本中,除了这三种情况之外,没有其他方法可以创建新的。(例外的是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
- 在 JavaScript 对象中设置要使用的运算符的属性
- 使用+=运算符未定义对象中的第一个元素
- 使用扩展运算符和析构函数运算符修改不可变对象的最短方法是什么
- 什么's具有fn's赋值运算符两侧的名称(一个对象fn)
- 使用或运算符为对象指定值
- Symfony2 JSON 对象 - 错误未捕获类型错误:无法使用“in”运算符搜索“636”
- ES6 扩展运算符在对象上的应用是标准的 ECMAScript 规范吗?
- JavaScript 中对象的运算符 == 和 ===
- Angular2 在带有正斜杠的对象键上使用猫王运算符
- 通过使用 AngularJS 遵循 OR 运算符仅过滤对象中的特定字段
- 如果未使用新运算符,则返回新对象
- 为什么删除运算符返回 true,即使属性未从对象中删除
- D3:对象调用前的 + 运算符
- 为什么当我执行这个 JavaScript 语句来创建一个新的 Number 对象(使用 new 运算符)时,Chrome
- 了解JavaScript对象、数组和[]运算符
- javascript中的新运算符和对象
- 循环对象以使用javascript/Jquery创建AND运算符
- Javascript三元运算符(?:)在单个块中更改和返回对象
- 为什么用新运算符调用Javascript全局对象时会有所不同
- 与typeof运算符一起使用时,javascript null返回对象