Какви са основните разлики между използването на CoffeeScript extends
спрямо Backbone.js extend
?
Например, как е
class User extends Backbone.Model
различен от
User = Backbone.Model.extend()
Какви са основните разлики между използването на CoffeeScript extends
спрямо Backbone.js extend
?
Например, как е
class User extends Backbone.Model
различен от
User = Backbone.Model.extend()
Двете са предназначени да бъдат еквивалентни. За да цитирам регистъра на промените на Backbone.js:
0.3.0: Основните класове вече могат безпроблемно да се наследяват от класовете на CoffeeScript.
И Child extends Parent
на CoffeeScript, и Child = Parent.extend()
на Backbone правят три важни неща:
Child.prototype
на new ctor
, където ctor
е функция, чийто прототип е Parent.prototype
. Това установява прототипно наследство.Parent
върху Child
.Child.__super__ = Parent
. Това е главно за поддържане на подобна на Ruby ключова дума super
на CoffeeScript в методите на Child
.Има някои разлики. Ако използвате метода extend()
на Backbone, губите от синтактичната захар на класа на CoffeeScript като super
и статичните свойства/методи.
Model = Backbone.Model.extend
set: (attrs, options) ->
super
който се компилира до (неправилно)...
var Model;
Model = Backbone.Model.extend({
set: function(attrs, options) {
return set.__super__.constructor.call(this, arguments);
}
});
Можете обаче да използвате супер по този начин:
Model = Bakbone.Model.extend()
Model::set = ->
super
който се компилира до (правилно)...
var Model;
Model = Backbone.Model.extend();
Model.prototype.set = function() {
return Model.__super__.set.apply(this, arguments);
};
Недостатъкът на класовете на coffeescript е, че в зависимост от това как организирате и компилирате кода си, всеки клас може да има функцията __extends()
на CoffeeScript, добавена към горната част на дефиницията на класа в компилирания javascript. Този допълнителен код, дублиран десетки пъти, може значително да увеличи вашите файлове. Особено вярно, ако използвате рамка, която обгръща вашия код в модули common.js.
Така че бих използвал extend()
на Backbone по подразбиране за постно компилиран код. След това, когато имате специален случай, в който би било добре да използвате синтаксиса на класа на coffeescript, продължете и го използвайте... пестеливо.
class
като цяло се изпълнява по-ефективно?
- person rudolph9; 31.01.2013