3

我正在尝试学习 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());
4

2 回答 2

4

它之所以有效,是因为您将Book构造函数中的函数添加到this. 因此,无论您传递给Bookviaapply的任何对象,方法都会在此对象上设置。

但是TechBook没有方法Book可能有通过它的原型。

例如,如果你有类似的东西:

Book.prototype.getTitle = function()...

除非您正确设置了原型,否则TechBook不会有此功能。TechBook


通过在构造函数中设置函数,您可以为您创建的每个实例创建每个方法的新实例。原型用于避免这种情况,以便多个实例可以共享代码。

于 2011-05-25T14:38:14.343 回答
1

我正在尝试学习 JavaScript 对象继承。我指的是 Shelley Powers 的 JavaScript Cookbook。

在子类中你需要调用 superclass.apply(this,arguments) 来使用它的属性。根据这本书,我还需要写一些类似 subclass.prototype = new superclass();

我没有那本书。Javascript 没有类,最好暂时忘记它们,只关注原型继承的工作原理。您可以模拟基于类的继承,但这通常不是必需的,甚至是不可取的。

您的代码不使用原型继承,它在构造函数创建的每个实例上创建属性。

当您从 inside 调用BookTechBook,它不是作为构造函数调用,而是作为函数调用并this从 传递对象TechBook,因此属性会直接添加到该对象。

返回的对象new TechBook继承自TechBook.prototype,但您尚未对其设置任何属性。

代码模式似乎使用构造函数来模拟使用闭包的私有和特权成员,模块模式更常用于此。

最后,BookTechBook更适合写成函数声明而不是表达式。

于 2011-05-25T14:52:39.817 回答