我在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}时调用原型链,直到找到方法。为什么这不起作用?我必须误解一些基本的东西。
答案 0 :(得分:1)
当您编写new Child()
时,返回的对象会(通过__proto__
)链接到Child.prototype
的当前值。
在此之后将新对象分配给Child.prototype
时,这不会影响现有实例(仍然指向旧的原型对象)。
答案 1 :(得分:1)
当您声明var c = new Child()
时,您正在构建一个新的Child对象。在制作c
对象时,尚未为此构造函数声明原型,因此其原型未定义且仍未定义。在事实之后声明构造函数的原型属性时,它不会更新。 c
对象的原型已经冻结,因为它已经被制作好了。
请记住,Javascript是伪古典的。一切都是对象,没有真正的课程。