Javascript 为什么必须在实例化子类之前创建对象

Javascript 为什么必须在实例化子类之前创建对象,javascript,inheritance,Javascript,Inheritance,我在JavaScript中遇到了一个简单的继承问题,子类继承自父类。但是,在使用Object#create建立继承时,似乎必须在实例化子类之前: function Child() {} function Parent() {} Parent.prototype.sayhello = function () { console.log("hello world"); } // Apparently, this must precede instantiation: // Child.

我在JavaScript中遇到了一个简单的继承问题,
子类继承自
父类。但是,在使用Object#create建立继承时,似乎必须在实例化
子类之前:

function Child() {}

function Parent() {}

Parent.prototype.sayhello = function () {
    console.log("hello world");
}

// Apparently, this must precede instantiation:
// Child.prototype = Object.create(Parent.prototype); //works, console logs "hello world"

var c = new Child();

// We get a TypeError: c.sayhello is not a function
Child.prototype = Object.create(Parent.prototype);

c.sayhello(); //TypeError: c.sayhello is not a function

我的想法是,即使
Child.prototype=Object.create(Parent.prototype)在实例化之后出现,我们仍然将
子类的原型设置为指向
父类的原型,因此当调用
sayhello
时,将搜索原型链,直到找到方法为止。为什么这样不行?我一定是误解了一些基本的东西。

当您编写
new Child()
时,返回的对象(通过
\uuuuuuu proto\uuuuu
)链接到
Child.prototype
的当前值


当您将新对象分配给
Child.prototype
之后,这不会影响现有实例(仍然指向旧的原型对象)。

当您编写
new Child()
时,返回的对象将(通过
\uuuuuuuuuuu
)链接到
Child.prototype
的当前值


当您将新对象分配给
Child.prototype
之后,这不会影响现有实例(仍然指向旧原型对象)。

当您声明
var c=new Child()
时,您正在构造一个新的子对象。在创建
c
对象时,尚未为该构造函数声明原型,因此其原型未定义且保持未定义状态。当您在事件发生后声明构造函数的原型属性时,它不会更新。该
c
对象就其原型而言仍处于冻结状态,因为它已经制造出来了


记住Javascript是伪经典的。一切都是一个对象,没有真正的类。

当您声明
var c=new Child()
时,您正在构造一个新的子对象。在创建
c
对象时,尚未为该构造函数声明原型,因此其原型未定义且保持未定义状态。当您在事件发生后声明构造函数的原型属性时,它不会更新。该
c
对象就其原型而言仍处于冻结状态,因为它已经制造出来了


记住Javascript是伪经典的。一切都是一个对象,没有真正的类。

我认为任何新对象都引用了相同的构造函数原型。那么,你能说这些对象引用了原型对象的“它们自己的”副本吗?不确定什么是正确的技术表达方式it@fibono:您混淆了对象和引用。它们引用了
.prototype
当前指向的对象。对不起,我还不是100%清楚。那么,在这种情况下,是否有一个“新”和一个“旧”原型对象--两个独立的对象?@fibono:Yes–Child.prototype的原始值和
object.create(…)
的结果。你需要理解改变一个对象和用一个新对象替换它之间的区别。我认为任何新对象都引用了相同的构造函数原型。那么,你能说这些对象引用了原型对象的“它们自己的”副本吗?不确定什么是正确的技术表达方式it@fibono:您混淆了对象和引用。它们引用了
.prototype
当前指向的对象。对不起,我还不是100%清楚。那么,在这种情况下,是否有一个“新”和一个“旧”原型对象--两个独立的对象?@fibono:Yes–Child.prototype的原始值和
object.create(…)
的结果。你需要理解改变一个对象和用一个新对象替换它之间的区别。为什么它不更新呢?我以为
c
\u proto
指向
Child.prototype
,所以当
Child.prototype
被更新(即使在事实之后)指向
Parent.prototype
,然后
c``s
\u proto`指向更新后的
Child.prototype
对象。@fibono:你不是“更新
Child.prototype
对象”-您正在创建一个全新的对象,并将
.prototype
设置为指向它。但是为什么它不更新呢?我认为
c
\u proto\u
指向
Child.prototype
,所以当
Child.prototype
更新时(即使在事实之后)若要指向
Parent.prototype
,则
c``s
\u proto`指向更新后的
子.prototype
对象。@fibono:您不是在“更新
子.prototype
对象”-您正在创建一个全新的对象,并将
.prototype
设置为指向它。