2013-11-14 59 views
0

我已經類定義爲:Javascript擴展類與道具?

function MyClass() { 

} 

MyClass.prototype = { 
     init: function() { 
       alert('My parent class!'); 
     }, 
     method1: function() {}, 
     method2: function() {} 
}; 

和屬性對象:

{ 
    init: function() { 
       MySubClass.superclass.init.apply(this, arguments); 
       alert('test!'); 
    }, 

    test: function() { 
       alert(); 
    } 
} 

,我需要功能,這將是延伸基類(MyClass的)道具(對象),並返回新的擴展的子類(到MySubClass):

MySubclass = extend(MyClass, { 
    init: function() { 
       MySubClass.superclass.init.apply(this, arguments); 
       alert('test!'); 
    }, 

    test: function() { 
       alert(); 
    } 
}); 

構造函數必須由新構造函數替換(從init)。

我需要一個正確的方法。

爲什麼它不能正常工作?

extend: function(bc, o) { 
     // result class (apply only first constructor) 
     var cls = function() {}; 
     cls.prototype = bc.prototype; 

     for (var k in o) 
      cls.prototype[k] = o[k]; 

     cls.superclass = bc.prototype; 

     return cls; 
    } 

回答

0

如果您打算使用庫,請使用underscore.js的_.extend。否則,該代碼添加到你的代碼:

extend = function(obj) { 
    each(slice.call(arguments, 1), function(source) { 
     if (source) { 
     for (var prop in source) { 
      obj[prop] = source[prop]; 
     } 
     } 
    }); 
    return obj; 
    }; 
+0

它是面向對象編程,MyClass不是對象。 MyClass是我想要用對象擴展的函數。 – xercool

+0

@xercool MyClass實際上是一個對象,雖然它是一個Function對象。只是供參考 –

0

我看你們還標有jQuery的 - 如果你確實使用jQuery,你可能有興趣使用$.extend

+0

爲什麼這是downvoted? –

+0

鄒根不值得投票,他是非常有幫助的。 – Max

+0

謝謝@ Max我很高興一些理智! $ .extend是我最常用的jquerie插件,因爲這個原因我一直使用它。 –

2

extend功能必須是這個樣子 - 現在這是比你應該如何真正落實它要簡單得多,但它應該工作:

var extend = function(Super, props) { 
    var sinstance = new Super() 
    var sclass = props.constructor || sinstance.constructor; 
    sclass.prototype.super = sinstance; 
    sclass.prototype.constructor = Super; 

    //use underscore extend prototypes cause im too lazy to type it out 
    _.extend(sclass.prototype, sinstance, props); 
    return sclass; 
} 

調用subclass.super.call(this, props...)允許您訪問覆蓋超級方法。

只是測試這個作品,如果下劃線的js是頁面上:

function MyClass() { 

} 
MyClass.prototype = { 
     init: function() { 
       alert('My parent class!'); 
     }, 
     method1: function() {}, 
     method2: function() {} 
}; 

MySubclass = extend(MyClass, { 
    init: function() { 
       this.super.init.apply(this, arguments); 
       alert('test!'); 
    }, 

    test: function() { 
       alert(); 
    } 
}); 

var test = new MySubclass(); 
test.init("yo"); //alerts My parent class 

爲您更新,你也可以這樣做:

MySubclass2 = extend(MyClass, { 
    constructor: function() { 
     this.init(); 
    }, 

    init: function() { 
       this.super.init.apply(this, arguments); 
       alert('test!'); 
    }, 

    test: function() { 
       alert(); 
    } 
}); 

var test2 = new MySubclass2();//alerts My parent class 
+0

我認爲$ .extend也可以工作,但我不記得方法 – megawac

+0

'new Super()'將調用基類的構造函數的語法,但我需要用子類方法替換類構造函數。 – xercool

+0

好吧,從你的例子我假設你想使用'super'構造函數。你需要通過擴展函數的功能,像我剛更新我的答案 – megawac

0

在此請看:https://github.com/haroldiedema/joii

var BaseClass = function() 
{ 
    this.some_var = "foobar"; 

    /** 
    * @return string 
    */ 
    this.someMethod = function() { 
     return this.some_var; 
    } 
}; 

var MyClass = new Class({ extends: BaseClass }, function() 
{ 
    /** 
    * @param string value 
    */ 
    this.__construct = function(value) 
    { 
     this.some_var = value; 
    } 

}) 

用法:

var obj = new MyClass("Hello World!"); 
console.log(obj.someMethod()); // Hello World!