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,尽管如此。为什么?
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,它就起作用了。谢谢