【问题标题】:Javascript: Function, Object, new ....a little bit of confusionJavascript: Function, Object, new ....有点混乱
【发布时间】:2023-04-09 01:38:01
【问题描述】:

在网上我读到:

“嗯,Javascript,或者更好的 ECMAScript,是一种基于对象的语言,所以.. 任何不是基本类型(未定义、null、数字、字符串、布尔值)的东西都是 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 中的对象(或实例),其中对象是属性和方法的“包”......”不是那么真实在所有情况下?

另一种情况如下:

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,是一种基于对象的语言,所以.. 任何不是原始类型(未定义、null、数字、字符串、布尔值)的东西都是 JavaScript 中的对象(或实例),其中对象是属性和方法的“包”……”

提前致谢

好的...我会尽量准确一点。 我读到“任何不是原始类型(未定义、null、数字、字符串、布尔值)的东西都是 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)...或者可以返回自身或默认情况下未定义。 .. 有些功能无法执行,只能“实例化”?和其他函数可以包含执行经典函数以获得正常值但不被实例化的函数??? 非常非常奇怪的行为...... 关于这个烂摊子的命名、设计和边界,我能得到帮助吗? 再次感谢...

【问题讨论】:

  • 我不明白。您能否准确描述一下您的问题是什么?
  • return fe; 覆盖构造函数/实例行为,而是将函数本身分配给obj2,而不管new。不要返回任何东西,你会得到一个行为符合预期的实例。更好的是:了解添加到 JavaScript 中的新 class 内容。
  • 我已经投票结束这个话题,因为它太宽泛了。您在这里似乎有四个独立的问题,没有一个表达得非常清楚。
  • "函数怎么样" - 它们也是对象(不管它们的种类)。

标签: javascript function object return new-operator


【解决方案1】:

当你调用一个函数作为构造函数(即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())

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 2015-02-22
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多