2015-01-15 76 views
0

我一直在我的網絡應用中使用John Resig javascript class implementation,但測試顯示它非常慢。我真的覺得它對於擴展對象的方式很有用,並且從更好的代碼和更少的冗餘中獲得好處。在JavaScript中實現簡單繼承

在某些文章中解釋說,由於處理_super方法的原因,速度很慢。 由於super是Java風格,並且大部分時間我都是用PHP開發的,所以我使用parent::樣式(在PHP中使用)製作了我自己的Resig實現版本,旨在使其更快。那就是:

(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); 

這方面有任何意見?我這樣快嗎?正確性怎麼樣?

+1

此問題似乎是脫離主題,因爲它要求[代碼審查](http://codereview.stackexchange.com/)。 – Quentin

+0

是的,如果你可以將它移動到正確的部分會更好 – albanx

+0

@Quentin我把它移到這裏http://codereview.stackexchange.com/questions/77592/implementing-simple-and-fast-inheritance-in- JavaScript的。你有什麼想法? – albanx

回答

-1

在一個乍一看,這看起來還不錯:),但我認爲做的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); 

它速度快,乾淨並且自己進行屬性檢查。