Javascript 为什么在对象构造函数中定义的方法在使用;新",;,但不是在使用“时”;对象。创建";?

Javascript 为什么在对象构造函数中定义的方法在使用;新",;,但不是在使用“时”;对象。创建";?,javascript,Javascript,我为“car”创建一个构造函数,然后创建两个car,一个使用“new”关键字,另一个使用“Object.create” 顺便问一下:是否可以像使用“new”一样使用“Object.prototype”立即设置属性? (因此我不必使用下一行“car2.name=“hyundai”) 如果我随后将“.honk()”方法设置为“car.prototype”,则它适用于“car1”和“car2”: 但是,如果我在“car”构造函数中定义“.honk()”方法,那么“car1”可以使用它,但“car2”不

我为“car”创建一个构造函数,然后创建两个car,一个使用“new”关键字,另一个使用“Object.create”

顺便问一下:是否可以像使用“new”一样使用“Object.prototype”立即设置属性? (因此我不必使用下一行“car2.name=“hyundai”)

如果我随后将“.honk()”方法设置为“car.prototype”,则它适用于“car1”和“car2”:

但是,如果我在“car”构造函数中定义“.honk()”方法,那么“car1”可以使用它,但“car2”不能!为什么?

function car (name) {
    this.name=name
    this.honk = function(){
        return `${this.name}'s honk`;
    }
}

您刚刚发现了运算符和之间的主要区别。两者都利用原型继承,但只使用构造函数,而只创建一个以第一个参数作为原型的对象

是否可以像使用“新建”一样使用“Object.create”立即设置属性


不,不是。这就是为什么我们使用构造函数,以便能够在不重复代码的情况下初始化新实例的属性
Object.create
,另一方面,只创建一个从给定原型继承的空对象。

因为
Object.create
不调用构造函数?因为
Object.create
设置与第一个参数一起传递的原型,第二个参数用于传递新对象的自身属性。“不引用构造函数”不太正确,接收对象的
.constructor
属性指向构造函数:-)实际上您可以编写
const car2=object.create(car.prototype);car2.constructor(“现代”)
对,谢谢你指出这一点,我正在编辑……的第二个参数允许你为新创建的对象创建自己的属性,还是我有点误解了这个问题?@Teemu我知道,为了简化,我忽略了这一点(而且,无可否认,因为我越来越不喜欢第二个参数-
object.create(…,…)
对象相同。定义属性(Object.create(…),…)
,这更清晰,而且通常
对象。分配(Object.create(…),…)
更容易)。但不管您是使用它,还是
car2.name=“现代”“
与OP一样,初始化属性-我的主要观点是,一旦初始化代码变得更复杂(如创建自己的方法,如OP的最后一段代码),它就会变得重复。使用
对象设置自己的属性。create
在某些用例中非常方便,也许OP以后会从中受益。我记得几年前你责备我,因为我在一个例子小提琴中使用了一个带有properties对象的“过于复杂”的结构。
car.prototype.honk= function (){
     return `${this.name}'s honk`
}
function car (name) {
    this.name=name
    this.honk = function(){
        return `${this.name}'s honk`;
    }
}