Вы хотите вынудить только детей быть выбранными? 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;
}
Я бы предложил следующий шаблон, который использует функцию 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); // ...
}
});
Хорошо, трюк с воспроизведением системы стиля класса / экземпляра в 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 только с немного более неуклюжим синтаксисом:
У Дугласа Крокфорда есть хорошие статьи о классическом и прототипном наследовании в Javascript, которые должны стать хорошей отправной точкой.
Также вдохновлен Крокфордом, но у меня был хороший опыт того, что он называет "функциональным наследованием". "используя" конструкторские функции ". 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;
};