Javascript: функция, объект, новый .... немного путаницы - PullRequest
0 голосов
/ 26 ноября 2018

в сети я читаю:

"Ну, Javascript или, что лучше, ECMAScript, это объектно-ориентированный язык, так что ... все, что не является примитивным типом (неопределенный, ноль, число, строка,логическое значение) - это объект (или экземпляр) в JavaScript, где объект является «сумкой» свойств и методов ... »

и:

КогдаФункция вызывается с ключевым словом «new», затем функция называется функцией конструктора и возвращает новый экземпляр.В таких случаях значение «this» относится к вновь созданному экземпляру.

Теперь мой код:

function fe(){
    var i;
    var j = 0;
    return j;
};
process.stdout.write("fe --> "); console.log(fe);      // [Function: fe]
process.stdout.write("fe() --> "); console.log(fe());  // 0

var vfe = new fe();
process.stdout.write("vfe --> " + vfe + " - "); console.log(vfe);      [object Object] - fd {}




var fd = function(){
    var i;
    var j = 0;
};
process.stdout.write("fd --> "); console.log(fd);      // [Function: fd]
process.stdout.write("fd() --> "); console.log(fd());  // undefined

var vfd = new fd();
process.stdout.write("vfd --> " + vfd + " - "); console.log(vfd);      [object Object] - fd {}

В первом у меня есть возвращаемое значение, а новый возвращаетобъект как в последнем случае: у меня есть объект {}, и поэтому я могу добавить свойства и методы

в другом случае:

function fe(){
    var i;
    var j = 0;
    return fe;
};
process.stdout.write("fe --> "); console.log(fe);        // [Function: fe]
process.stdout.write("fe() --> "); console.log(fe());    // [Function: fe]

var vfe = new fe();
process.stdout.write("vfe --> "); console.log(vfe);      // [Function: fe]


var fd = function(){
    var i;
    var j = 0;
    return fd;
};
process.stdout.write("fd --> "); console.log(fd);      // [Function: fd]
process.stdout.write("fd() --> "); console.log(fd());  // [Function: fd]

var vfd = new fd();
process.stdout.write("vfd --> "); console.log(vfd);    // [Function: fd] 

В этом случае у меня есть значение или функциявозвращено, что все, кроме объекта .... Теперь: id: «Все, что не является примитивным типом (неопределенным, нулевым, числом, строкой, логическим значением), является объектом (или экземпляром) в JavaScript, где объект - это»сумка "свойств и методов ..." не так верна во всех ситуациях?

Другая ситуация заключается в следующем:

function fe () {
    var pri_var1;
    // private, not accessible from extern
    function pri_fun1(){ return "pri_fun1"; }    
    // private, not accessible from extern
    function pri_fun2(){ return "pri_fun2"; }       
    //static property
    fe.sta_var1 = 0;    //static property ....is never a good idea but...for folks!!!
    //static method
    fe.sta_fun1 = function(){return pri_fun2();}
    //public not heritable
    this.pub_fun1 = function(){return "pub_fun1";}
    //public heritable
    fe.prototype.pub_her_fun1 = function() { return "pub_her_fun1";}
    //return fe;
}

var obj2 = new fe();
console.log("obj2 --> ",obj2);
console.log(obj2.pub_fun1());
console.log(fe.sta_fun1());

Если я раскомментирую // return fe;«узел» говорит: console.log (obj2.pub_fun1 ());^

TypeError: obj2.pub_fun1 не является функцией ... Если я оставлю комментарий, все также будет работать ....

Небольшая путаница с функцией и объектом в (снова):

"Ну, Javascript или лучше ECMAScript - это объектно-ориентированный язык, поэтому все, что не является примитивным типом (неопределенный, ноль, число, строка, логическое значение), является объектом (или экземпляр) в JavaScript, где объект представляет собой «мешок» свойств и методов ... »

заранее спасибо

Хорошо ... Я постараюсь бытьточнее.Я прочитал «Все, что не является примитивным типом (неопределенным, нулевым, числовым, строковым, логическим), является объектом (или экземпляром) в JavaScript, где объект является« мешком »свойств и методов ...» Следовательно, функциятакое объект?Каждая функция?Возьмите функцию:

function fe(){
    return 1;
};

и следующие инструкции:

console.log(fe);    // [Function: fe]
console.log(fe());  // 1
var vfe = new fe(); 
console.log(vfe);   // fe {}

, если я хорошо прочитал: fe - это функция, которая, будучи не примитивной, является «объектом» (какого родаобъекта? Может быть, несколько сложное представление типа [Function: fe] неправильно вызвало объект не OO-способом?) ... но оно становится объектом OO-способом "bag" {} только после нового (vfe) ...., но он также может быть вызван (fe ()) и выдает значение (1) ... или может возвращать себя или по умолчанию undefined ... Некоторые функции не могут быть выполнены, а только "созданы"?и другая функция может содержать функции, которые являются классической функцией для выполнения, чтобы получить нормальное значение, но не для создания экземпляра ???Очень, очень странное поведение ... Могу ли я помочь с точки зрения именования, дизайна и границ этого беспорядка?еще раз спасибо ...

1 Ответ

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

Когда вы вызываете функцию в качестве конструктора (т.е. new func()), JS выполняет следующие шаги:

  • создает новый объект, давайте назовем его newObject
  • он вызывает вашу функцию особым образом, так что this внутри вашей функции становится newObject
  • функция запускается и возвращает значение, давайте назовем его retVal
  • теперь JSсмотрит в retVal.Если это ничто (то есть undefined) или примитивное значение, тогда retVal игнорируется (отбрасывается), и результат всего new func() будет равен newObject
  • , если, однако,, retVal является объектом, JS делает совсем наоборот: newObject отбрасывается, и значение new func() будет retVal

Это объясняет ваши результаты, потому что в первомесли вы возвращаете примитив (0), а во втором случае - объект (fd, который является функцией, а функции являются объектами).

Иллюстрация:

function returnsPrimitive() {
  this.x = 1
  return 42
}

console.log(returnsPrimitive())
console.log(new returnsPrimitive())


function returnsObject() {
  this.x = 1
  return {foo:1}
}

console.log(returnsObject())
console.log(new returnsObject())
...