我正在尝试学习JavaScript对象继承。我指的是Shelley Powers的JavaScript Cookbook。
在子类中,您需要调用superclass.apply(this,arguments)来使用其属性。根据这本书,我还需要写一些类似subclass.prototype = new superclass();
但是,我注意到事情没有使用subclass.prototype = new superclass();声明。以下是我的代码。 subclass.prototype = new superclass();
的目的是什么var Book = function (newTitle, newAuthor) {
var title;
var author;
title = newTitle;
author = newAuthor;
this.getTitle = function () {
return title;
}
this.getAuthor = function () {
return author;
}
};
var TechBook = function (newTitle, newAuthor, newPublisher) {
var publisher = newPublisher;
this.getPublisher = function () {
return publisher;
}
Book.apply(this, arguments);
this.getAllProperties = function () {
return this.getTitle() + ", " + this.getAuthor() + ", " + this.getPublisher();
}
}
//TechBook.prototype = new Book(); // Even when commented,
var b1 = new TechBook("C Pro", "Alice", "ABC Publishing");
var b2 = new TechBook("D Pro", "Bob", "DEF Publishing");
alert(b1.getAllProperties());
alert(b2.getAllProperties());
alert(b1.getTitle());
alert(b2.getTitle());
答案 0 :(得分:4)
它的工作原理是因为您要将Book
构造函数中的函数添加到this
。因此,无论您通过Book
传递给apply
的对象,都会在此对象上设置方法。
但TechBook
没有方法Book
可能通过其原型。
E.g。如果你有类似的东西:
Book.prototype.getTitle = function()...
然后TechBook
除非您正确设置TechBook
原型,否则不会有此功能。
通过在构造函数中设置函数,可以为每个创建的实例创建每个方法的新实例。原型用于避免这种情况,因此多个实例可以共享代码。
答案 1 :(得分:1)
我正在尝试学习JavaScript对象 遗产。我指的是 Shelley Powers的JavaScript Cookbook。
在子类中,您需要调用 superclass.apply(this,arguments)to 使用它的属性。并根据 这本书我也需要写 像subclass.prototype =这样的东西 new superclass();
我没有那本书。 Javascript没有类,最好暂时忘记它们,只关注原型继承的工作原理。您可以模拟基于类的继承,但通常不需要甚至不需要。
您的代码不使用原型继承,它会在构造函数创建的每个实例上创建属性。
当您从Book
内调用TechBook
时,它不会被调用为构造函数,它被称为函数并从this
传递TechBook
对象,因此属性直接添加到该对象。
new TechBook
返回的对象继承自 TechBook.prototype ,但您尚未在其上设置任何属性。
代码模式似乎使用构造函数来使用闭包模拟私有和特权成员,模块模式更常用于此。
最后,将 Book 和 TechBook 更合适地编写为函数声明而不是表达式。