如何在 JavaScript 中创建自己的类实现并为其传递构造函数

How to create an own implementation of class in JavaScript and pass it a constructor

提问人:DungeonDragon 提问时间:5/6/2021 最后编辑:Pawel VeselovDungeonDragon 更新时间:5/6/2021 访问量:43

问:

也许这样的问题已经存在,但我没有找到它,我仍然有问题。我试过了:

function defClass(obj) {
    const constructor = obj.constructor;
    constructor.prototype = obj;
    return constructor;
}

然后:

const Person = defClass({
    constructor: function (name) {
        this.name = name;
    },
    voice() {
        console.log(`Hello, I'm ${this.name}`);
    } 
})

它有效。但是,如果我想使用这样的构造函数怎么办:

const Person = defClass({
    constructor(name) {
        this.name = name;
    },
    voice() {
        console.log(`Hello, I'm ${this.name}`);
    } 
})

我认为它更类似于原生实现。但是我收到一个错误:“人不是构造函数”。这两种方式有什么区别?对不起这么愚蠢的问题,我只是想弄清楚这个基本的事情。感谢您的帮助。

JavaScript 对象 方法 这个 原型

评论

0赞 DSPdav 5/6/2021
您是否打算使用对象函数构造函数?如果是,那么也许这篇文章可以给你另一个关于Javascript OOP的观点。geeksforgeeks.org/......
0赞 T.J. Crowder 5/6/2021
自 ES2015 以来,JavaScript 就已经有一个结构,它(现在)在任何模糊的现代环境中都得到了普遍支持。不需要此功能。defClass
0赞 Bergi 5/6/2021
如果您使用的是 ES6 方法语法,为什么不同时使用 ES6 类语法呢?
0赞 DungeonDragon 5/7/2021
我知道 ES6 有一个类结构,我使用它。我在原型中进行了一些实践,我只是想弄清楚它是如何工作的。就这样

答:

0赞 CertainPerformance 5/6/2021 #1

方法 - 即:

someMethodName() {
}

不能作为构造函数调用 - 你会得到你看到的错误。将方法改为函数:

function defClass(obj) {
  const constructor = obj.constructor;
  constructor.prototype = obj;
  return constructor;
}

const Person = defClass({
  constructor: function(name) {
    this.name = name;
  },
  voice() {
    console.log(`Hello, I'm ${this.name}`);
  }
})

const p = new Person('foo');
p.voice();

或者调用时不要使用:new

function defClass(obj) {
  const constructor = obj.constructor;
  constructor.prototype = obj;
  
  return function(...args) {
    const instance = Object.create(obj);
    constructor.apply(instance, args);
    return instance;
  };
}

const Person = defClass({
  constructor(name) {
    this.name = name;
    return this;
  },
  voice() {
    console.log(`Hello, I'm ${this.name}`);
  }
})

const p = Person('foo');
p.voice();