Javascript 在ES6中创建多个构造函数

Javascript 在ES6中创建多个构造函数,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,在ES5中,可以为一个类创建多个构造函数,同时使用原型为这两个类保留公共部分,如下所示 function Book() { //just creates an empty book. } function Book(title, length, author) { this.title = title; this.Length = length; this.author = author; } Book.prototype = { ISBN: "",

在ES5中,可以为一个类创建多个构造函数,同时使用原型为这两个类保留公共部分,如下所示

function Book() {
    //just creates an empty book.
}


function Book(title, length, author) {
    this.title = title;
    this.Length = length;
    this.author = author;
}

Book.prototype = {
    ISBN: "",
    Length: -1,
    genre: "",
    covering: "",
    author: "",
    currentPage: 0,
    title: "",

    flipTo: function FlipToAPage(pNum) {
        this.currentPage = pNum;
    },

    turnPageForward: function turnForward() {
        this.flipTo(this.currentPage++);
    },

    turnPageBackward: function turnBackward() {
        this.flipTo(this.currentPage--);
    }
};

var books = new Array(new Book(), new Book("First Edition", 350, "Random"));
我希望使用ES6类和构造函数语法实现相同的结果

class Book{
    constructore (){}
}

ECMAScript中不支持函数/构造函数重载。如果您仍想破解arguments对象,可以使用arguments对象来完成此操作

constructor(title, length, author) {
        if(!arguments.length) {
            // empty book
        }
        else {
            this.title = title;
            this.Length = length;
            this.author = author;
        }
    }

实际上,确实可以为一个原型创建多个构造函数。您只需查看原型的
构造函数
属性。因此,您可以创建多个构造函数,如下所示:

const type=(原型、构造函数)=>
(constructor.prototype=原型,constructor);
常数书={
翻到(第页){
this.page=page;
},
转载{
这个.page++;
},
turnPageBackward(){
本页--;
}
};
const EmptyBook=类型(book,函数EmptyBook(){
this.constructor=EmptyBook;
此.ISBN=“”;
this.title=“”;
this.author=“”;
this.genre=“”;
此参数为“”;
这个长度=-1;
本页=0;
});
常数书=类型(书、功能书(标题、作者、长度){
this.constructor=Book;
此.ISBN=“”;
this.title=标题;
this.author=作者;
this.genre=“”;
此参数为“”;
这个长度=长度;
本页=0;
});

只需给构造函数起不同的名字。希望对您有所帮助。

您也可以通过将ES6类与extends一起使用来绕过此限制

class Base{
    Foo;
    Bar;
}

class TypeA extends Base {
    constructor(value) {
        this.Foo = value;
    }
}

class TypeB extends Base {
    constructor(value) {
        this.Bar = value;
    }
}

我相信有两个答案。一个使用带有IIFE函数的“纯”Javascript来隐藏其辅助构造函数。另一个使用NodeJS模块来隐藏其辅助构造功能

我将仅展示带有NodeJS模块的示例

类Vector2d.js:


/*
使用三种类型的构造函数实现Vetor2d类型的类。
*/
//如果构造函数成功执行,
//必须将其值更改为“true”。让全局_wassecuted=false;
全局_wassected=false;
//测试number_值是否为数字类型
函数isNumber(数字\ U值){
设hasError=!(数字的类型值=='number')| |!是有限的(数字值);
如果(hasError==false){
hasError=isNaN(数值);
}
返回!hasError;
}
//具有与其值关联的“x”和“y”属性的对象。
函数向量(x,y){
返回{'x':x,'y':y};
}
//x和y为“未定义”时的构造函数
函数新向量(x,y){
如果(x==未定义&&y==未定义){
全局执行=真;
返回新向量(0,0);
}
}
//在x和y为数字的情况下,构造函数
函数新向量数(x,y){
设x_isNumber=isNumber(x);
设y_isNumber=isNumber(y);
if(x_isNumber&&y_isNumber){
全局执行=真;
返回新向量(x,y);
}
}
//如果x是对象,y是任意
//事情(他被忽略了!)
函数新向量对象(x,y){
设x_ehObject=typeof x=='object';
//忽略y型
if(x_ehObject){
//仅为代码清晰而指定对象
设x_object=x;
//测试x_对象是否具有属性“x”和“y”
if('x'在x_对象中&'y'在x_对象中){
全局执行=真;
/*
我们只知道x_对象具有属性“x”和“y”,
现在我们将测试属性值​​都是有效的,,
再次调用类构造函数。
*/
返回新矢量2D(x_object.x,x_object.y);
}
}
}
//返回构造函数数组的函数
函数构造函数(){
设c=[];
c、 推送(新向量为零);
c、 推送(新的向量数);
c、 推送(新的向量对象);
/*
你的想象力是极限!
创建任意数量的构造函数。
*/
返回c;
}
类向量2D{
构造函数(x,y){
//返回构造函数的数组
让我的构造函数=构造函数();
全局_wassected=false;
//用于返回“vector”函数的变量
让新的_向量;
//遍历执行其相应构造函数的数组
for(让index=0;index
useVector2d.js文件使用Vector2d.js模块:

const Vector=require('./Vector2d');
设v1=新向量({x:2,y:3});
log(`v1=${v1.toString()}`);
设v2=新向量(1,5.2);
log(`v2=${v2.toString()}`);
设v3=新向量();
log(`v3=${v3.toString()}`);
终端输出:

v1 = (x: 2, y: 3)
v2 = (x: 1, y: 5.2)
v3 = (x: 0, y: 0)

这样我们就避免了脏代码(许多if和switch分布在整个代码中),难以维护和测试。每个建筑功能都知道要测试哪些条件。增加和/或减少建筑功能现在很简单。

这是不可能的
newbook()
将调用第二个函数,该函数将隐藏第一个函数,因为它稍后才声明。在JS中,函数只能通过名称来识别。@sadro那么你的意思是说在JS版本ES5或ES6中都不可能,对吗?是的,没错。@sabdro非常感谢你告诉我,将结束这个问题。当然,你也可以接受答案。我喜欢你的答案!