Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:函数,对象,新的…有点混乱_Javascript_Function_Object_Return_New Operator - Fatal编程技术网

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

Javascript:函数,对象,新的…有点混乱,javascript,function,object,return,new-operator,Javascript,Function,Object,Return,New Operator,我在网上读到: “好吧,Javascript,或者更好的ECMAScript,是一种基于对象的语言,所以。。 任何不是基元类型(未定义、null、number、string、boolean)的东西都是JavaScript中的对象(或实例),其中对象是属性和方法的“包…” 以及: 当使用“new”关键字调用函数时,该函数称为构造函数并返回一个新实例。在这种情况下,“this”的值指的是新创建的实例 现在,我的代码: function fe(){ var i; var j = 0;

我在网上读到:

“好吧,Javascript,或者更好的ECMAScript,是一种基于对象的语言,所以。。 任何不是基元类型(未定义、null、number、string、boolean)的东西都是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 {}
在第一种情况下,我返回了value,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、number、string、boolean)的东西都是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());
如果我取消注释//返回fe;“节点”表示: console.log(obj2.pub_fun1()); ^

类型错误:obj2.pub_fun1不是函数。。。 如果我留下评论,一切都会好起来

关于函数和对象的一点混淆(再次):

“好吧,Javascript,或者更好的ECMAScript,是一种基于对象的语言,所以..任何不是基元类型(未定义、null、数字、字符串、布尔值)的东西都是Javascript中的对象(或实例),其中对象是属性和方法的“包…”

提前谢谢

好的……我会尽量说得更准确些。 我读到“任何不是基元类型(未定义、null、number、string、boolean)的东西都是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]以非面向对象的方式不正确地调用了对象?)。。。但它只有在一个新的(vfe)…之后才以OO方式成为对象,即“bag”{},但它也可以被调用(fe())并生成一个值(1)…或返回自身或默认情况下未定义的。。。 某些函数无法执行,但只能“实例化”?而另一个函数可以包含一些经典函数,这些函数需要执行以获得正常值,但不需要实例化??? 非常非常奇怪的行为。。。 我能在命名、设计和界限方面得到帮助吗?
再次感谢

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

  • 它创建了一个新对象,我们称之为
    newObject
  • 它以一种特殊的方式调用函数,因此函数中的
    这个
    就变成了
    新对象
  • 函数运行并返回一个值,我们称之为
    retVal
  • 现在JS查看
    retVal
    。如果它没有任何内容(即,
    undefined
    )或原语值,那么
    retVal
    将被忽略(丢弃),整个
    newfunc()的结果将是
    newObject
  • 但是,如果
    retVal
    是一个对象,JS的作用正好相反:
    newObject
    被丢弃,而
    newfunc()
    的值将是
    retVal
这解释了您的结果,因为在第一种情况下,您返回的是一个原语(
0
),在第二种情况下,返回的是一个对象(
fd
,它是一个函数,函数是对象)

说明:

函数returnsPrimitive(){
这个.x=1
返回42
}
console.log(returnsPrimitive())
console.log(新的returnsPrimitive())
函数returnsObject(){
这个.x=1
返回{foo:1}
}
console.log(returnsObject())

console.log(newreturnsobject())
我不明白。你能描述一下你的问题是什么吗?
返回fe覆盖构造函数/实例行为,而将函数本身分配给
obj2
,而不考虑
新建
。如果不返回任何内容,则会得到一个按预期运行的实例。更好的方法是:学习添加到JavaScript中的新的
内容。我已经投票将其作为主题关闭,因为它太宽泛了。这里似乎有四个独立的问题,没有一个表达得很清楚,“函数呢”-它们也是对象(不管它们的种类如何)。