微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

函数`function`中Javascript`new`的奇怪行为

如何解决函数`function`中Javascript`new`的奇怪行为

我遇到了令我惊讶的事情。请考虑以下四个功能

function A() {
 this.q = 1;
}

function B() {
 this.q = 1;
 return this;
}

function C() {
 this.q = 1;
 return 42;
}

function D() {
 this.q = 1;
 return {};
}

,让我们通过所有对象创建对象(通过new

console.log('a',new A());
console.log('b',new B());
console.log('c',new C());
console.log('d',new D());

这是输出

a A { q: 1 }
b B { q: 1 }
c C { q: 1 }
d {}

前三个似乎表明函数返回什么并不重要,JS只关心每个函数this所做的操作(这是我以前的看法,顺便说一句)。但是最后一个与此矛盾。

那么,这是怎么回事?我修改后的规则是“如果函数返回Object,则保留该值;否则,保留this”。但是我对此不太确定。

解决方法

在JavaScript中,当您调用不带test()之类的新函数时,它将仅运行该函数并执行它。返回该函数返回的内容

当您使用new test()之类的新函数调用函数时,它期望return语句返回一个对象,否则返回this对象。

如此

function test() {
    this.q = 1
}

test(); // return undefined

new test(); // return {q:1}
,

使用 new 运算符时,它会创建一个对象。

返回值符合预期。如果在返回中是一个对象,则将返回该对象;否则,如果返回是一个函数,则将返回该函数。

function A(){
    this.b = 3;
    return function(){return 4;};
}
function B(){
    this.b = 3;
    return { d:4};
}

console.log(typeof (new A())); //function
console.log(typeof (new B())); //object {d:4}

如果返回中没有其他值或不存在,则运算符将优先作为对象返回。

function C(){
    this.b = 3;
    return "78";
}
console.log(typeof (new C())); // object {b:3}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。