JavaScript多级继承

eva*_*anb 5 javascript inheritance

我一直试图了解JavaScript继承.令人困惑的是,似乎有许多不同的方法 - 克罗克福德提出了相当多的方法,但不能完全理解他的散文(或者可能只是没有把它与我的特定情况联系起来).

这是我到目前为止的一个例子:

// base class
var Item = function( type, name ) {
    this.type = type;
    this.name = name; // unused
};

// actual class (one of many related alternatives)
var Book = function( title, author ) {
    this.name = title; // redundant (base class)
    this.author = author;
};
Book.prototype = new Item('book'); // duplication of "book"

// instances
var book = new Book('Hello World', 'A. Noob');
Run Code Online (Sandbox Code Playgroud)

这种方法给我留下了相当多的冗余,因为我不能将特定于实例的属性委托给基类(在原型分配时,属性值是未知的).因此每个子类必须重复该属性.有没有推荐的解决方法?

奖金问题:是否有合理的方法来避免"新"操作员,或者是否会被视为反对该语言的新手?

Ant*_*nes 3

我将向您展示我如何实现此类目标:-

 function Item(type, name)
 {
    if (arguments.length > 0)
    {
        this.type = type;
        this.name = name;
    }
 }

 function Book(title, author)
 {
   Item.call(this, "book", title);
   this.author = author;
 }
 Book.prototype = new Item();
Run Code Online (Sandbox Code Playgroud)

因此,我在这里做的几件事是,当我检测到一个新实例只是作为原型创建时,我会跳过基类中的一些初始化代码。

避免重复的真正推动者是用作Item.call基类构造函数。这可以避免原件中的重复。

至于避免new它,如果您说明为什么要这样做会有帮助吗?然而,一个简单的方法是将函数直接添加到“类函数”而不是函数的原型中:-

Book.Create = function (title, author) { return new Book(title, author); }


var aBook = Book.Create("Code Complete 2", "Steve McConnell");
Run Code Online (Sandbox Code Playgroud)

虽然我在这里看到的收获很少。

  • 感谢那。我明白你的意思。也许不是检查“arguments.length”,而是明确支持告诉构造函数它用于构建原型,例如拥有一个唯一的对象(“var CONSTRUCT = {};”),然后将其作为第一个参数传递。检查将是“if (firstArgName !== CONSTRUCT) { ... }”。但我们正在讨论实施细节。我**真的**喜欢你的把戏,它就在我的包里。:-) (2认同)