Реализация простого наследования в JavaScript

Я использовал Реализация класса 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);

Есть мнение по этому поводу? Я так быстро? Как насчет правильности?

0

Решение

На первый взгляд, это выглядит неплохо :), но я думаю, что реализация, осуществляемая 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);

Это быстро, чисто и делает проверку собственного свойства.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]