Каков будет хороший минималистический метод наследования JavaScript?

Вы хотите вынудить только детей быть выбранными? http://css.maxdesign.com.au/selectutorial/selectors_child.htm

.area1
{
        border:1px solid black;
}
.area1>.item
{
    color:red;
}
.area2
{
    border:1px solid blue;
}
.area2>.item
{
    color:blue;
}

6
задан Guss 10 September 2009 в 11:52
поделиться

4 ответа

Я бы предложил следующий шаблон, который использует функцию clone для наследования от прототипов, а не экземпляров:

function Shape(x, y) {
    this.x = x;
    this.y = y;
}

Shape.prototype.draw = function() {
    throw new Error('Arbitrary shapes cannot be drawn');
};

function Square(x,y,side) {
    Shape.call(this, x, y); // call super constructor
    this.side = side;
}

// inherit from `Shape.prototype` and *not* an actual instance:
Square.prototype = clone(Shape.prototype);

// override `draw()` method
Square.prototype.draw = function() {
    gotoXY(this.x,this.y); lineTo(this.x+this.side, this.y); // ...
};

Важно, чтобы методы постоянно находились в прототипе (который в любом случае так и должен быть по соображениям производительности), поэтому вы можете вызывать методы суперкласса через

SuperClass.prototype.aMethod.call(this, arg1, arg2);

. С некоторым синтаксическим сахаром вы можете сделать JS похожим на классический класс - на основе языка:

var Shape = Class.extend({
    constructor : function(x, y) {
        this.x = x;
        this.y = y;
    },
    draw : function() {
        throw new Error('Arbitrary shapes cannot be drawn');
    }
});

var Square = Shape.extend({
    constructor : function(x, y, side) {
        Shape.call(this, x, y);
        this.side = side
    },
    draw : function() {
        gotoXY(this.x,this.y); lineTo(this.x+this.side, this.y); // ...
    }
});
5
ответ дан 10 December 2019 в 00:41
поделиться

Хорошо, трюк с воспроизведением системы стиля класса / экземпляра в JavaScript заключается в том, что вы можете использовать наследование прототипа только для экземпляров. Таким образом, вы должны иметь возможность создать «неэкземплярный» экземпляр, который используется только для наследования, и иметь метод инициализации, отдельный от самой функции конструктора.

Это минимальная система, которую я использую (до добавления излишеств), передача специального одноразового значения в конструктор, чтобы он создавал объект без его инициализации:

Function.prototype.subclass= function() {
    var c= new Function(
        'if (!(this instanceof arguments.callee)) throw(\'Constructor called without "new"\'); '+
        'if (arguments[0]!==Function.prototype.subclass._FLAG && this._init) this._init.apply(this, arguments); '
    );
    if (this!==Object)
        c.prototype= new this(Function.prototype.subclass._FLAG);
    return c;
};
Function.prototype.subclass._FLAG= {};

Использование new Function () - это способ избежать формирования ненужного замыкания над subclass (). Вы можете заменить его более красивым выражением function () {...} , если хотите.

Использование сравнительно чистое и в целом похоже на объекты в стиле Python только с немного более неуклюжим синтаксисом:

1
ответ дан 10 December 2019 в 00:41
поделиться

У Дугласа Крокфорда есть хорошие статьи о классическом и прототипном наследовании в Javascript, которые должны стать хорошей отправной точкой.

4
ответ дан 10 December 2019 в 00:41
поделиться

Также вдохновлен Крокфордом, но у меня был хороший опыт того, что он называет "функциональным наследованием". "используя" конструкторские функции ". YMMV.

ОБНОВЛЕНИЕ : Извините, я забыл: вам все равно нужно дополнить Object улучшенным методом , чтобы получить хороший доступ к супер-методу. Вероятно, вам не подходит.

var makeShape = function (x, y) {
    that = {};
    that.x = x;
    that.y = y;
    that.draw = function() {
        throw new Error("Arbitrary shapes cannot be drawn");
    }
    return that;
};

var makeSquare = function (x, y, side) {
    that = makeShape(x, y);
    that.side = side;
    that.draw = function() {
        gotoXY(that.x,that.y); lineTo(that.x+that.side, that.y); ...
    }
    return that;
};
-1
ответ дан 10 December 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: