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)
这种方法给我留下了相当多的冗余,因为我不能将特定于实例的属性委托给基类(在原型分配时,属性值是未知的).因此每个子类必须重复该属性.有没有推荐的解决方法?
奖金问题:是否有合理的方法来避免"新"操作员,或者是否会被视为反对该语言的新手?
我将向您展示我如何实现此类目标:-
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)
虽然我在这里看到的收获很少。