Javascript:函数,对象,新函数……有点混乱

时间:2018-11-26 16:19:46

标签: javascript function object return new-operator

在网络上,我读到:

  

“那么,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 {}

在第一种情况下,我返回了值,而在最后一种情况下,new返回了一个对象:我有一个对象{},所以我可以追加属性和方法

在另一种情况下:

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“不是原始类型(未定义,null,数字,字符串,布尔值)的任何东西都是JavaScript中的对象(或实例),其中Object是属性和方法的“包” ...”在任何情况下都可以吗?

另一种情况如下:

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());

如果我取消注释//返回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是一个非原始的函数,它是一个“对象”(什么样的对象?也许有点复杂的类型表示[功能:fe]以一种非OO的方式被称为不正确的对象?)...但是它成为OO中的对象{bag} {}的方式仅在新(vfe)....之后出现,但也可以被调用(fe())并产生值(1)...,或者可以返回自身或默认情况下未定义。 .. 有些功能不能执行,而只能“实例化”?其他函数可以包含经典函数,要执行以获取正常值但不能实例化的函数??? 非常非常奇怪的行为 我可以在此混乱的命名,设计和边界方面获得帮助吗? 再次感谢...

1 个答案:

答案 0 :(得分:1)

当您调用函数作为构造函数(即new func())时,JS会执行以下步骤:

  • 它创建了一个新对象,我们称之为newObject
  • 它以特殊的方式调用您的函数,因此函数内部的this变为newObject
  • 该函数运行并返回一个值,我们将其称为retVal
  • 现在JS调查了retVal。如果没有任何内容(即undefined)或原始值,则retVal被忽略(扔掉),整个new func()的结果将是newObject < / li>
  • 但是,如果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())