Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么是;对象。调用;什么意思?_Javascript_Oop - Fatal编程技术网

Javascript 什么是;对象。调用;什么意思?

Javascript 什么是;对象。调用;什么意思?,javascript,oop,Javascript,Oop,Object.call(this)是什么意思?每个JavaScript函数都有一个toString()、call()和apply() 在JavaScript中的函数是成熟的对象上阅读更多关于它们的信息。当它们作为参数传递给另一个函数时,也不会保留其作用域。所以,在下面的代码中 function bb_graphics_GraphicsContext(){ Object.call(this); this.bbdevice=null; this.bbmatrixSp=0;

Object.call(this)
是什么意思?

每个JavaScript函数都有一个
toString()
call()
apply()


在JavaScript中的函数是成熟的对象上阅读更多关于它们的信息。当它们作为参数传递给另一个函数时,也不会保留其作用域。所以,在下面的代码中

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);
}
func1
将调用
obj1.method1
,但它不会
警告
obj1
property1
的值,因为我们所做的只是传递函数对象,而不是它的
上下文。这就是
call
apply
的作用所在。它们允许您插入作用域,告诉函数此
的含义。以下示例有效:

var obj1 = {
    property1: "blah",
    method1: function () {
        alert(this.property1);
        // do stuff
    }
 };

 function func1 (passedFunction) {
     passedFunction();
     // do other stuff
 }

 func1(obj1.method1);
现在,我们通过调用
call
,并将要用作
this
的对象传递给它,强制或明确地告诉了
obj1.method1
它的上下文将是什么

call
apply
几乎相同,只是它们如何处理被调用函数的附加参数。有关更多信息,请参阅这些关于MDN的文章:、和


所有这些都已经说过,
bb\u graphics\u GraphicsContext
是一个构造函数。(您可能已经猜到了)通过使用
new
关键字,
var obj1=new bb\u graphics\u GraphicsContext()调用它。当它到达函数的第1行时,它接受
this
对象,并调用泛型
对象
构造函数,显式注入新对象
this
(在
bb\u graphics\u GraphicsContext
构造函数中)作为
对象
构造函数的
this
。我假设这个函数/构造函数的编写者这样做是为了确保
bb\u graphics\u GraphicsContext
中新创建的对象获得了基本
对象的所有基本方法。但我不知道为什么这是必要的,因为如果您使用
new
关键字调用
bb\u graphics\u GraphicsContext
,它将自然地获取所有这些属性。

Object.call将在提供的上下文中执行某个函数,它可以用于从一个对象上调用另一个对象上的函数

mozilla开发网络提供了一个很好的解释


除了浪费资源和内存分配之外,这将毫无用处

如果Object.call(this)将被分配给函数构造函数bb\u graphics\u GraphicsContext的变量或属性

this.myObject=Object.call(this)

在该实例中,您唯一得到的是一个空对象“不包含提供的上下文”


虽然Object.call可能不会像这里所表达的那样起任何作用,但是这个概念可能很重要。基本上,您将在Node.js中看到的继承示例是:

util.inherits
将生成一个新的
MyStream
inherit(具有与
EventEmmiter相同的原型)。如果我们对MyStream有兴趣访问通过
EventEmmiter
原型继承的函数,这就足够了。但是,如果在构造中传递了变量呢?如果我们有:

const util = require('util');
const EventEmitter = require('events');

function MyStream() {
  EventEmitter.call(this);
}

util.inherits(MyStream, EventEmitter);
在这种情况下,当实例化
MyObject
时,在运行时传递
code
变量。因此,子类需要通过:

function MyObject() {
    this.code = "2nV_ahR";
}

以继承
code
变量。什么可以接受设置该变量的参数。所以当我执行
var o=new MySubObject()
时,
MySubObject
内部的
this
指的是
o
,然后将其传递给
call
方法,因此当
MyObject
执行
this.code=…
时,它实际上是将
代码
传递给
o

我知道。我想知道在这种情况下会发生什么。这个关键词指的是什么??调用Object.call(this)之后会发生什么;它变成了一个递归函数。@miqbal-uhh。。。什么?它不会将任何东西转换为递归函数;这到底意味着什么?@Pointy有什么区别,函数a(){a();var b=0;}这根本不是OP中的内容。你的例子实际上是一个无限递归的bug;OP中的代码只是调用
对象
构造函数。这只是对不同函数的普通函数调用。所有这些都是完全正确的,但它仍然没有回答为什么有人会用
对象
构造函数这样做的问题。是否有人希望以后重新定义对象?我不完全确定这在JavaScript中是否可行。等待刚刚在Safari(Mac)上试用过。是的,当然是可能的,但我怀疑任何人都不会愿意。你可能想清楚,你想知道为什么特别是一个构造函数(这个“bb_graphics_GraphicsContext”函数)会用它自己的
this
引用来做这件事。它被认为是构造函数。但是如果是,就必须调用函数之外的函数。在我的答案末尾添加额外的注释,以了解它的作用,并提供关于为什么要这样做的思考。也许更多的上下文会有所帮助。何时以及如何调用
bb\u graphics\u GraphicsContext
?现在最好的答案是猜测。在这种情况下,“特定函数”是
对象
构造函数本身。
const util = require('util');
const EventEmitter = require('events');

function MyStream() {
  EventEmitter.call(this);
}

util.inherits(MyStream, EventEmitter);
function MyObject() {
    this.code = "2nV_ahR";
}
function MySubObject() {
    MyObject.call(this);
}