JavaScript: использование наследования "как есть" - PullRequest
3 голосов
/ 22 марта 2012

Я хочу использовать очень простое наследование в Javascript без каких-либо библиотек (jQuery, Prototype и т. Д.), И я забываю, как это сделать.

Я знаю, как создать простое не наследуемоеобъект:

function Foo(x)
{
    this.x = x;
}
Foo.prototype = {
    inc: function() { return this.x++; }
}

, который я затем могу использовать следующим образом:

js>f1=new Foo(0)
[object Object]
js>f1.inc()
0
js>f1.inc()
1
js>f1.inc()
2

Но как бы добавить подкласс с одним дополнительным методом, который наследует метод Foo "inc", не меняякласс Foo?

function Bar(x)
{
    this.x = x;
}
Bar.prototype = new Foo();
Bar.prototype.pow = function(y) { return this.x+"^"+y+"="+Math.pow(this.x,y); }

Это кажется правильным, за исключением этой странности с конструктором;Мне нужно вызвать конструктор Foo один раз, чтобы создать прототип Bar, и когда вызывается конструктор Bar, кажется, что нет способа вызвать конструктор Foo.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Хитрость заключается в использовании Object.create вместо new Foo(). Он также создаст новый объект, унаследованный от Foo.prototype, но без , вызывающего конструктор Foo.

Bar.prototype = Object.create(Foo.prototype);

Хотя Object.create не может быть определен в старых браузерах, его можно определить самостоятельно, если вам нужно. (следующий код взят из ссылки MDN)

if (!Object.create) {  
    Object.create = function (o) {  
        if (arguments.length > 1) {  
            throw new Error('Object.create implementation only accepts the first parameter.');
            //tbh, the second parameter is for stuff you dont need right now.
        }  
        function F() {}  
        F.prototype = o;  
        return new F();  
    };  
}  
0 голосов
/ 22 марта 2012

Вы можете использовать этот код.Он делает именно то, что вы делаете, и это единственный известный мне способ наследования, но эта функция использует create, который является новым в ECMAScritp 5, если он доступен, и выполняет дополнительную проверку:

function inherit(p) {
if (p == null) throw TypeError(); // p must be non-null
if (Object.create) // If Object.create() is defined (ECMAScript 5 way)
return Object.create(p); // use it
var t = typeof p; // If not, do some more checking (the old way)
if (t !== "object" && t !== "function") throw TypeError();
function f() {}; // Define constructor
f.prototype = p; // Set prototype to p.
return new f(); // call constructor f() to create an "heir" of p
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...