为什么Object#created必须在子类的实例化之前

时间:2016-01-17 00:28:24

标签: javascript inheritance

我在JavaScript中有一个简单的继承问题,其中Child类继承自Parent类。但是,在使用Object#create来建立继承时,它似乎必须在实例化Child类之前出现:

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);在实例化之后出现,我们仍然将Child类的原型设置为指向Parent的原型,所以当{{1}时调用原型链,直到找到方法。为什么这不起作用?我必须误解一些基本的东西。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

当您声明var c = new Child()时,您正在构建一个新的Child对象。在制作c对象时,尚未为此构造函数声明原型,因此其原型未定义且仍未定义。在事实之后声明构造函数的原型属性时,它不会更新。 c对象的原型已经冻结,因为它已经被制作好了。

请记住,Javascript是伪古典的。一切都是对象,没有真正的课程。