“Object.call”是什么意思?

时间:2012-04-01 12:46:36

标签: javascript oop

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)是什么意思?

5 个答案:

答案 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上下文。这就是callapply进来的地方。它们允许您注入范围,告诉函数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的对象传递给它。

callapply几乎完全相同,除了它们如何处理被调用函数的其他参数。有关详细信息,请参阅MDN上的这些文章:callapplyFunction

所有这些都被说过,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()

this odetocode.com article

上详细了解它们