相关疑难解决方法(0)

构造函数可以返回哪些值以避免返回此值?

除了this使用new关键字调用构造函数之外,Javascript中的return语句可以返回一个值的具体情况是什么?

例:

function Foo () {
  return something;
}

var foo = new Foo ();
Run Code Online (Sandbox Code Playgroud)

如果我没有弄错,if something是非函数原语,this将被返回.否则something返回.它是否正确?

IOW,可以something采取什么样的价值观(new Foo () instanceof Foo) === false

javascript constructor new-operator

87
推荐指数
1
解决办法
2万
查看次数

构造函数可以返回原语吗?

我问这个问题是因为我注意到 TypeScript 允许声明返回原始类型的构造函数,例如:

type Constructor1 = new () => string; // Primitive string
Run Code Online (Sandbox Code Playgroud)

相对于

type Constructor2 = new () => String; // String object
Run Code Online (Sandbox Code Playgroud)

这让我想知道 JavaScript 是否真的允许创建一个在使用语义调用时返回原始值的函数,即通过原始性测试的new值:

type Constructor1 = new () => string; // Primitive string
Run Code Online (Sandbox Code Playgroud)

不用说,我找不到任何生成原始值的构造函数调用的示例,因此我想这一定是 TypeScript 类型模型的另一个奇怪之处。或者原始构造函数真的存在吗?


作为参考,这是我尝试过的。

预定义构造函数

预定义的构造函数NumberBooleanString等在使用 调用时都会生成一个对象new,尽管它们在作为常规函数调用时返回一个原始值。IE

type Constructor2 = new () => String; // String object
Run Code Online (Sandbox Code Playgroud)

function isPrimitive(value) {
    return value !== Object(value);
}
Run Code Online (Sandbox Code Playgroud)

return在构造函数中

语句return会覆盖构造函数中的实例this,但前提是返回值是对象: …

javascript primitive constructor new-operator

7
推荐指数
1
解决办法
771
查看次数

为什么这个构造函数不返回字符串?

考虑:

function Panda() {
   this.weight = 100;
   return [1,2]; 
}

console.log(new Panda());
Run Code Online (Sandbox Code Playgroud)

当我们使用newkeyword(new Panda())实例化时,它将返回:[1,2]

没有return语句,它返回: { weight: 100 }

function Panda() {
   this.weight = 100;
}

console.log(new Panda());
Run Code Online (Sandbox Code Playgroud)

使用返回语句,如:return "Hello",它返回{ weight: 100 }

function Panda() {
   this.weight = 100;
   return "Hello"; 
}

console.log(new Panda());
Run Code Online (Sandbox Code Playgroud)

为什么这样做?因为它必须是一个对象吗?

javascript paradigms class instantiation

6
推荐指数
0
解决办法
85
查看次数

为什么构造函数只能返回一个对象?

如果有像这样的构造函数

function a() {}
Run Code Online (Sandbox Code Playgroud)

然后

(new a) instanceof a === true
Run Code Online (Sandbox Code Playgroud)

但另一方面,

function a() { return {} }
Run Code Online (Sandbox Code Playgroud)

结果是

(new a) instanceof a === false
Run Code Online (Sandbox Code Playgroud)

所以我在想的是

function a() { return 123 }
Run Code Online (Sandbox Code Playgroud)

会导致同样的事情.但是,当返回一个数字时,

(new a) instanceof a === true
Run Code Online (Sandbox Code Playgroud)

这怎么可能?为什么我不能让构造函数返回除Object之外的其他内容?

(我知道让一个构造函数返回一个数字是没用的但是我想理解这个行为的'为什么')

javascript constructor return object instanceof

5
推荐指数
1
解决办法
271
查看次数

为什么构造函数返回对象,而不是JavaScript中的原语?

我正在尝试理解关于构造函数的JavaScript(或至少V8)行为.

我知道,JavaScript构造函数应该永远不会返回任何东西(所以:) undefined.

但请考虑这个JavaScript:

function Thing() { 
  return '';
}
var t = new Thing();
console.log(t, typeof t); // => Thing {} "object"
Run Code Online (Sandbox Code Playgroud)

现在,如果你这样做:

function Thing() { 
  return { hi: '' };
}
var t = new Thing();
console.log(t, typeof t); // => Object {hi: ""} "object"
Run Code Online (Sandbox Code Playgroud)

乃至:

function Thing() { 
  this.a = 'a';
  return { hi: '' };
}
var t = new Thing();
console.log(t, typeof t); // => Object {hi: ""} "object"
Run Code Online (Sandbox Code Playgroud)

那么,如果你编写这种代码,为什么JavaScript中的构造函数会返回一个对象,而不是一个原语?


这个SO答案中也提到了这种 …

javascript constructor

5
推荐指数
1
解决办法
185
查看次数

来自`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 {};
}
Run Code Online (Sandbox Code Playgroud)

让我们new从所有对象中创建对象(通过):

console.log('a', new A());
console.log('b', new B());
console.log('c', new C());
console.log('d', new D());
Run Code Online (Sandbox Code Playgroud)

这是输出:

a A { q: 1 }
b B { q: 1 }
c C { q: 1 }
d {}
Run Code Online (Sandbox Code Playgroud)

前三个似乎表明函数返回什么并不重要,JS 只关心每个函数的作用this(这是我以前的信念,顺便说一句)。但最后一个与此相反。

那么,这里发生了什么?我修改后的规则是“如果函数返回一个Object,我们保留它。否则,我们保留this”。但我对此感到非常不确定。

javascript javascript-objects

5
推荐指数
1
解决办法
53
查看次数

在 es6 中扩展单例类

我需要在 JavaScript 中扩展一个单例类。

我面临的问题是我获取了我所扩展的类实例,而不是仅获取了该类的方法。

我尝试删除super以获取实例,但随后出现错误

在访问“this”或从派生构造函数返回之前,必须调用派生类中的超级构造函数

代码示例:

let instanceA = null;
let instanceB = null;

class A {
  constructor(options) {
    if (instanceA === null) {
      this.options = options;
      instanceA = this;
    }
    return instanceA;
  }
}

class B extends A {
  constructor(options) {
    if (instanceB === null) {
      super()
      console.log('real class is ' + this.constructor.name)
      this.options = options
      instanceB = this;
    }
    return instanceB;
  }
}

const a = new A({
  i_am_a: "aaaaaa"
});

const b = new …
Run Code Online (Sandbox Code Playgroud)

javascript oop es6-class

3
推荐指数
1
解决办法
3685
查看次数

Javascript 新运算符*总是* 覆盖返回值?

基于MDN 上关于新操作符如何工作的这些规范:

构造函数返回的对象成为整个 new 表达式的结果。如果构造函数没有明确返回对象,则使用在步骤 1 中创建的对象。(通常构造函数不返回值,但如果他们想覆盖正常的对象创建过程,他们可以选择这样做。)

我相信 new 运算符只会在未提供返回值的情况下覆盖返回值。然而,它似乎总是如此,你永远无法覆盖它。

例如

function test() { return 1; }
new test() // returns {} and not 1
Run Code Online (Sandbox Code Playgroud)

有人可以举例说明情况并非如此,例如他们在文档中所指的吗?

javascript

2
推荐指数
1
解决办法
89
查看次数