Javascript 如何将类重写为函数构造函数

Javascript 如何将类重写为函数构造函数,javascript,Javascript,我正试图将一个类重写到函数构造函数中 我有一个初始代码: class Car{ constructor(brand){ this.brand = brand } get brand(){ if (this._brand) console.log(this._brand) else console.log("Don't forget to pick a car!") } set brand(value){

我正试图将一个类重写到函数构造函数中

我有一个初始代码:

class Car{
    constructor(brand){
        this.brand = brand
    }
    get brand(){
        if (this._brand) console.log(this._brand)
        else console.log("Don't forget to pick a car!")
    }
    set brand(value){
        if (value == "Tesla") this._brand = value
        else console.log("Choose another car")
    }
}

let car = new Car("BWM")
我最终得到了这样的结果:

function Car(brand){
    this.brand = brand
    Object.defineProperty(this, "brand",{
        get(){
            if (this._brand) console.log(this._brand)
            else console.log("Don't forget to pick a car!")
        },
        set(value){
            if (value == "Tesla") this._brand = value
            else console.log("Choose another car")
        }
    })
}

let car = new Car("BMW")
但它的工作原理并不完全相同。运行初始代码时,我立即得到了console.log(“选择另一辆车”),但在我的代码中,一开始没有这样的输出。那么,是否有可能使其工作方式与初始代码完全相同?
我还想知道:
1.是否可以将getter或setter直接添加到F.prototype?
2.据我所知,初始代码中的
get brand()
set brand()
位于Car.prototype中。但是新的object car在其自己的词汇环境中有属性this.brand=brand,因此它不应该在protytype链上的其他地方寻找setter和getter,尽管如此。为什么?

  • 是否可以将getter或setter直接添加到F.prototype
  • 您必须将方法添加到函数本身的原型中

    如果有特定的原因,可以继续使用
    Object.defineProperty
    来执行此操作,但也可以通过以下方式直接将属性添加到原型中:

    Car.prototype={/*方法和属性*/}

    例如:

    等级车{
    建造商(品牌){
    这个品牌
    }
    获取品牌(){
    if(此._品牌)console.log(此._品牌)
    else console.log(“别忘了选一辆车!”)
    }
    设定品牌(价值){
    如果(价值=“特斯拉”)这个品牌=价值
    else console.log(“选择另一辆车”)
    }
    }
    出租汽车=新车(“BWM”)
    功能车(品牌){
    这个品牌
    }
    CarF.prototype={
    获取品牌(){
    if(此._品牌)console.log(此._品牌)
    else console.log(“别忘了选一辆车!”)
    },
    设定品牌(价值){
    如果(价值=“特斯拉”)这个品牌=价值
    else console.log(“选择另一辆车”)
    }
    }
    
    让car2=new CarF(“BMW”)
    您需要将
    this.brand=brand
    放在
    defineProperty
    @Seblor之后谢谢它现在可以工作了,但还是有点不清楚。那么,为什么它在课堂上起作用呢?遵循相同逻辑的get和set在构造函数完成其部分时尚未初始化。它与类一起工作,因为属性是在调用构造函数之前设置的。这允许您在构造函数中调用方法(或使用计算属性),但在这种情况下,我将丢失构造函数属性。有没有一种方法可以完全相同地保存构造函数,比如:CarF.prototype[get brand]=function(){}。丢失构造函数属性是什么意思?使用函数创建的类的构造函数是函数体本身。这两个示例的行为完全相同。我的意思是,如果我们在执行CarF.prototype={}之前使用console.dir(CarF),那么原型中就会有prototype属性和构造函数。据我所知:CarF.prototype.constructor==CarF,因此car2.constructor==CarF。但是一旦执行CarF.prototype={},car2.construcotr!=CarF,因为我们基本上只是重新分配了整个CarF的原型对象,并丢失了构造函数。这就是为什么我要求对其进行修改而不是重新分配。但第二个选项正是我所需要的,我只是在这之前将Object.defineProperty放在功能车身内。brand=brand,它就起作用了。谢谢