Что означает «Object.call»? - PullRequest
7 голосов
/ 01 апреля 2012
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 ]

10 голосов
/ 01 апреля 2012

Функции в 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, потому что все, что мы сделали, это передали объект функции, а не ее 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 для получения дополнительной информации: вызов , применяются и Функция .

Все это было сказано, 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, все эти свойства будут получены естественным путем.

0 голосов
/ 28 июля 2017

Хотя Object.call, вероятно, ничего не сделает, как здесь выражено, концепция может быть важной.В основном, пример, который вы увидите по наследованию в документации Node.js :

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.То, что вызывает , принимает параметр, который устанавливает переменную this.Итак ... когда я делаю var o = new MySubObject(), this внутри MySubObject относится к o, который затем передается методу call, так что когда MyObject делает this.code = ..., это на самом делепрохождение code до o!

0 голосов
/ 02 апреля 2012

Это абсолютно ничего не сделает, кроме траты ресурсов и выделения памяти.

Если 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)
0 голосов
/ 01 апреля 2012

Object.call выполнит определенную функцию в предоставленном контексте, его можно использовать для вызова функций из одного объекта в другом.

Сеть разработчиков Mozilla дает очень хорошее объяснение

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

0 голосов
/ 01 апреля 2012

Каждая функция JavaScript имеет toString(), call() и apply().

Подробнее о них читайте в этой статье odetocode.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...