используя Call для наследования объектов из функции - PullRequest
0 голосов
/ 21 ноября 2018

Я проводил некоторое тестирование и не понял, почему при использовании вызова я наследую от другого объекта, например, const objC = funcB.call (objA, 'Erades') Я получил объект, но еслиЯ наследую от функции Я получил функцию с проводным (для меня) поведением.

Я не понимаю, почему для получения метода BI нужно сделать funcC.getLastName ()

Если кто-нибудь может помочь мне понять это ...

TIA

// testing Call to inherit objects / functions
    // -------------------------------------------
    
    // we declare our first function
    const funcA = function(firstName) {
      this.firstName = firstName;
      this.getFirstName = function() {
          return 'My name is ' + this.firstName;
        };
      return this;
    };
    // Create an object out of that function
    const objA = new funcA('Rodrigo');
    
    // declare second function
    const funcB = function (lastName) {
      this.lastName = lastName;
      this.getLastName = function() {
        return 'My last name is ' + this.lastName;
      };
      return this;
    };
    
    // Create an Object from funcB and ObjectA
    const objC = funcB.call(objA,'Erades');
    // We get an object
    console.log("TYPE OF: ", typeof objC)
    console.log('raw:', objC);
    console.log('method A: ', objC.getFirstName());
    console.log('prop A: ', objC.firstName);
    console.log('method B: ', objC.getLastName());
    console.log('prop B: ', objC.lastName);
    console.log('------------');
    
    // if we don't want to create an object out of a function and an object,
    // we could also inherit two functions, but the result really surprise me 
    const funcC = funcB.call(funcA,'Alonso');
    // We get a function !!!!!
    console.log("TYPE OF: ", typeof funcC);
    console.log('raw:', funcC);
    // To get result we need to do this:
    console.log('method ==>: ', funcC('Rui'));
    console.log('method A: ', funcC('Rui').getFirstName());
    console.log('prop A: ', funcC('Maria').firstName);
    console.log('method B: ', funcC.getLastName()); // looks like static method ???
    console.log('prop B: ', funcC.lastName);
    console.log('------------');

1 Ответ

0 голосов
/ 21 ноября 2018

Вы не наследуете, когда используете call таким образом.Вы передаете экземпляр и получаете тот же экземпляр с некоторыми изменениями:

const funcA = function(firstName) {
  this.firstName = firstName;
  this.getFirstName = function() {
      return 'My name is ' + this.firstName;
    };
  return this;
};
const objA = new funcA('Rodrigo');

const funcB = function (lastName) {
  this.lastName = lastName;
  this.getLastName = function() {
    return 'My last name is ' + this.lastName;
  };
  return this;
};

const objC = funcB.call(objA,'Erades');
// ObjC IS ObjaA
console.log(objC === objA)

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

Передача функции в call() не отличается.Когда вы пишете:

funcB.call(funcA,'Alonso');

, вы вызываете функцию funcB с Alonso в качестве аргумента.Внутри этой функции this будет ссылаться на funcA.Таким образом, вы установите свойство lastName для свойств funcA и getLastName, указывающее на функцию, а затем вернете funcA, которое затем будет присвоено переменной funcC.funcC и funcA указывают на одну и ту же функцию.

const funcA = function(firstName) {
  this.firstName = firstName;
  this.getFirstName = function() {
      return 'My name is ' + this.firstName;
    };
  return this;
};

const funcB = function (lastName) {
  this.lastName = lastName;
  this.getLastName = function() {
    return 'My last name is ' + this.lastName;
  };
  return this;
};


const funcC = funcB.call(funcA,'Alonso');
// the same reference
console.log(funcC === funcA)
// but when you called funcB with it, it added some properties:
console.log("funC lastname:", funcC.lastName)
// they are the same object so this also works: 
console.log("also funcA lastname:", funcC.lastName)
...