是否可以通过仅使用apply函数并且不使用prototype属性在JavaScript中使用继承?

时间:2011-05-25 14:25:39

标签: javascript prototypal-inheritance

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

2 个答案:

答案 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 更合适地编写为函数声明而不是表达式。