Я использовал Реализация класса JavaScript Джона Резига в моих веб-приложениях, но тесты показывают, что это действительно медленно. Я действительно считаю, что это полезно для расширения объектов и получения преимуществ от лучшего кода и меньшей избыточности.
В каком-то посте было объяснено, что это было медленно из-за того, как _super
метод обрабатывается.
поскольку super
это стиль Java, и большую часть времени я разрабатываю на PHP, я делал свою собственную версию реализации Resig, используя parent::
стиль (используется в PHP), с целью сделать это быстрее. Вот:
(function () {
this.Class = function () {
};
Class.extend = function extend(prop) {
var prototype = new this();
prototype.parent = this.prototype;
for (var name in prop) {
prototype[name] = prop[name];
}
function Class() {
this.construct.apply(this, arguments);
}
Class.prototype = prototype;
Class.prototype.constructor = Class;
Class.extend = extend;
return Class;
};
}) ();
Случай использования:
var Person = Class.extend({
construct: function (name) {
this.name = name;
},
say: function () {
console.log('I am person: '+this.name);
},
});
var Student = Person.extend({
construct: function (name, mark) {
this.parent.construct.call(this, name);
this.mark = 5;
},
say: function () {
this.parent.say();
console.log('And a student');
},
getMark: function(){
console.log(this.mark);
}
});
var me = new Student('Alban');
me.say();
me.getMark();
console.log(me instanceof Person);
console.log(me instanceof Student);
Есть мнение по этому поводу? Я так быстро? Как насчет правильности?
На первый взгляд, это выглядит неплохо :), но я думаю, что реализация, осуществляемая coffeescript, в настоящее время является одной из самых сложных:
class Person
walk: ->
return
class myPerson extends Person
constructor: ->
super
переводит на это:
var Person, myPerson,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
Person = (function() {
function Person() {}
Person.prototype.walk = function() {};
return Person;
})();
myPerson = (function(_super) {
__extends(myPerson, _super);
function myPerson() {
myPerson.__super__.constructor.apply(this, arguments);
}
return myPerson;
})(Person);
Это быстро, чисто и делает проверку собственного свойства.
Других решений пока нет …