function bb_graphics_GraphicsContext(){
Object.call(this);
this.bbdevice=null;
this.bbmatrixSp=0;
this.bbix=1.000000;
this.bbiy=0;
this.bbjx=0;
this.bbjy=1.000000;
this.bbtx=0;
this.bbty=0;
this.bbtformed=0;
this.bbmatDirty=0;
this.bbcolor_r=0;
this.bbcolor_g=0;
this.bbcolor_b=0;
this.bbalpha=0;
this.bbblend=0;
this.bbscissor_x=0;
this.bbscissor_y=0;
this.bbscissor_width=0;
this.bbscissor_height=0;
this.bbmatrixStack=new_number_array(192);
}
Object.call(this)
是什么意思?
答案 0 :(得分:10)
JavaScript中的函数是完整的对象。当它们作为参数传递给另一个函数时,它们也不会保留它们的范围。所以,在下面的代码中......
var obj1 = {
property1: "blah",
method1: function () {
alert(this.property1);
// do stuff
}
};
function func1 (passedFunction) {
passedFunction();
// do other stuff
}
func1(obj1.method1);
... func1
会致电obj1.method1
,但不会alert
obj1
property1
的价值,因为我们只有done是传递函数对象,而不是它的this
上下文。这就是call
和apply
进来的地方。它们允许您注入范围,告诉函数this
的含义是什么。以下示例有效:
var obj1 = {
property1: "blah",
method1: function () {
alert(this.property1);
// do stuff
}
};
function func1 (passedObject, passedFunction) {
passedFunction.call(passedObject);
// do other stuff
}
func1(ob1, obj1.method1);
现在,我们通过调用obj1.method1
强制或明确告诉call
其上下文的内容,并将其用作this
的对象传递给它。
call
和apply
几乎完全相同,除了它们如何处理被调用函数的其他参数。有关详细信息,请参阅MDN上的这些文章:call,apply和Function。
所有这些都被说过,bb_graphics_GraphicsContext
是一个构造函数。 (您可能已经猜到了。)您可以使用new
关键字var obj1 = new bb_graphics_GraphicsContext();
来调用它。当它到达函数的第1行时,它接受this
对象,并调用泛型Object
构造函数,显式地注入新对象this
(在bb_graphics_GraphicsContext
构造函数中)作为this
构造函数的Object
。我假设这个函数/构造函数的编写者这样做是为了确保bb_graphics_GraphicsContext
中新创建的对象获得了基础Object
的所有基本方法。但我不知道为什么会这样做,就好像你用bb_graphics_GraphicsContext
关键字来呼叫new
一样,它会自然地抓住所有这些属性。
答案 1 :(得分:0)
Object.call将在提供的上下文下执行某个函数,它可以用来从另一个对象调用函数。
mozilla开发网络提供了非常好的解释
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call
答案 2 :(得分:0)
除了浪费资源和内存分配外,这绝不会做任何事情。
如果Object.call(this)已被赋值给函数构造函数的变量或属性bb_graphics_GraphicsContext
this.myObject = Object.call(this)
你在这个例子中唯一得到的是一个空对象“没有保留所提供的背景”
function MyConstructor(){
this.test01 = 0;
var b = Object.call(this); // similar to b = {}; or b = new Object()
console.log(b); // log object
console.log(b.test); // log undefined
this.test = 1;
}
var myObject = new MyConstructor();
console.log(myObject, window.test01)
答案 3 :(得分:0)
虽然Object.call可能不会像这里表达的那样做,但这个概念可能很重要。基本上,您将在Node.js documentation中继承的示例是:
const util = require('util');
const EventEmitter = require('events');
function MyStream() {
EventEmitter.call(this);
}
util.inherits(MyStream, EventEmitter);
util.inherits
将创建一个新的MyStream
继承(具有与EventEmmiter
相同的原型)。如果我们感兴趣的是MyStream可以访问通过EventEmmiter
原型继承的函数,那么这就足够了。但是,如果在构造上传递了变量怎么办?如果我们有以下内容怎么办?
function MyObject() {
this.code = "2nV_ahR";
}
在这种情况下,code
变量在MyObject
实例化时在运行时传递。因此,子类需要传递:
function MySubObject() {
MyObject.call(this);
}
为了继承code
变量。 call接受设置this
变量的参数的内容。所以...当我var o = new MySubObject()
时,this
内的MySubObject
引用o
,然后传递给call
方法,这样当MyObject
this.code = ...
确实将code
传递给o
!
答案 4 :(得分:-1)
每个JavaScript函数都有toString()
,call()
和apply()
。