Вместо чистого наследования, здесь, я бы идти с прототипом-расширением, если вы не построите какую-то большую уродливую фабрику, просто ради того, чтобы сказать, что «MovingPlatform» унаследована от «Платформы» в чистом смысле, на самом деле это не так, как вы ожидали.
Есть несколько проблем (обман, для одного), но если ваши объекты полностью основаны на this
, и вы в порядке с людьми, потенциально взломанными в консоли, тогда вам действительно нечего беспокоюсь о.
Во-первых, понять, что вы делаете внутри Platform
:
var MyObject = function (a) {
this.property = a;
this.method = function (b) { this.property += b; };
};
Каждый раз, когда вы делаете новый MyObject
, вы создаете новую версию функции .method
.
То есть, если вы сделаете 10 000 из них, будет также 10 000 копий этой функции.
Иногда это очень хорошая и безопасная вещь.
Это также может быть очень медленная вещь.
Проблема заключается в том, что все в вашем объекте использует this
, и поскольку ничего внутри функции не изменяется, нет никакой пользы для создания новых копий - просто дополнительная память.
... так:
MyObject = function (a) {
this.property = a;
};
MyObject.prototype.method = function (b) { this.property += b; };
var o = new MyObject(1);
o.method(2);
o.property; //3
Когда вы звоните new X
, где X
имеет свойства/методы по своему прототипу, те свойства/методы копируются на объект, во время его строительства.
Было бы так же, как происходит:
var method = function (b) { this.property += b; },
o = new MyObject(1);
o.method = method;
o.method(2);
o.property; // 3
За исключением без дополнительной работы делать это самостоятельно, вручную.
Преимущества здесь в том, что каждый объект использует ту же функцию.
Они в основном передают функции доступ ко всему их this
, и функция может делать с ней все, что захочет.
Там подвох:
var OtherObj = function (a, b) {
var private_property = b,
private_method = function() { return private_property; };
this.public_property = a;
this.unshared_method = function() { var private_value = private_method(); return private_value; };
};
OtherObj.prototype.public_method = function() {
return private_property;
};
var obj = new OtherObj(1, "hidden");
obj.public_property; // 1
obj.unshared_method(); // "hidden"
obj.public_method(); // err -- private_property doesn't exist
Так если вы не имеете много вы заботитесь о пребывании частных, самый простой способ сделать это было бы сделать многоразовую функцию, которая полагается на this
, который затем предоставить несколько прототипов через расширение.
// collision-handling
var testCollision = function (target) { this./*...*/ },
handleCollision = function (obj) { this./* ... */ };
// movement-handling
var movePlatform = function (x, y, elapsed) { this.x += this.speed.x*elapsed; /*...*/ };
// not really the cleanest timestep implementation, but it'll do for examples
var Platform = function (texture, x, y, w, h) {
this.x = x;
// ...
},
MovingPlatform = function (texture, x, y, w, h, speedX, speedY, etc) {
this.etc = etc;//...
};
Platform.prototype.testCollision = testCollision;
Platform.prototype.handleCollision = handleCollision;
MovingPlatform.prototype. // both of the above, plus the movePlatform method
Это очень много.
Именно поэтому функции в разных библиотеках будут clone
или extend
объектов.
var bunchOfComponents = {
a : function() { },
b : 32,
c : { }
},
myObj = {};
copy(myObj, bunchOfComponents);
myObj.a();
myObj.b; //32
Вашей функция повторного использования идет вверх, в то время как ужас написания собственного класса на основе иерархического наследования, с виртуальными переопределениями, рефератами и разделяемым частной собственностью, от руки, идет вниз.
Читайте о «наследовании прототипов» в JavaScript. – elclanrs
По соглашению функции конструктора (т. Е. Те, которые вы называете «новыми») должны быть капитализированы. –
@elclanrs Прототипирование этого, возможно, не может идти. По крайней мере, не в истинном стиле JS: 'var platform_instance = новая платформа (текстура, x, y, ширина, высота); MovingPlatform.prototype = platform_instance; var mPlatform = new MovingPlatform(); '. Все они будут иметь одинаковые текстуры, координаты и т. Д.Расширение прототипа объекта-конструктора, если вы можете гарантировать, что все соответствующие свойства объекта являются общедоступными, конечно, это отличная память. Но «наследование» посредством создания всех дочерних экземпляров совместно с прототипом одного родительского экземпляра здесь не помогает. – Norguard