2012-02-20 15 views
1

クラスの拡張Iは、現時点ではこれをテストしていて、クラスAを拡張しますが、現時点ではそれで問題が発生したクラスBを作成したいと思います:Javascriptを:

CLASS

var CustomClassA = function(){ 
    console.log('Custom Class A loaded') 
    this.message = ' Method Called'; 

    } 

    CustomClassA.prototype = { 
    constructor : CustomClassA, 
    firstMethod : function(msg){ 
     this._output(msg); 
    }, 
    secondMethod : function(msg){ 
     this._output(msg); 
    }, 
    thirdMethod: function(msg){ 
     this._output(msg); 
    }, 
    _output: function(m){ 
     return console.log(m + this.message); 
    } 
    } 

CLASS B :

var CustomClassB = CustomClassA.extend(

    function CustomClassB(){ 
     console.log('Custom Class B loaded') 
      this.message = ' Method Called from class B'; 

    },{ 
     firstMethod : function(msg){this._output(msg);}, 
      secondMethod : function(msg){this._output(msg);}, 
     thirdMethod: function(msg){this._output(msg);}, 
     _output: function(m){return console.log(m + this.message);} 
    }); 

ホープこの2つの例は、最初のインスタンスで簡単に行います。 ありがとう

+0

これらの「問題」は...ですか? – Pointy

+1

@Pointy多分 'CustomClassA.extend'は存在しませんか? –

+0

あなたはCustomClassA.extendを定義しておらず、それをCustomClassBに割り当てていませんか? –

答えて

1

最初の例は正常です。

第2の例は、Function.prototypeに機能プロパティextendが与えられている場合にのみ機能し、それ以外の場合はTypeErrorがスローされます。

代わりにこのようなものを試してください。

function CustomClassB(){ 
     console.log('Custom Class B loaded'); 
     this.message = ' Method Called from class B'; 
    } 

    CustomClassB.prototype = Object.create(CustomClassA.prototype); 

    CustomClassB.prototype.firstMethod = function(msg){this._output(msg);}; 
    CustomClassB.prototype.secondMethod = function(msg){this._output(msg);}; 
    CustomClassB.prototype.thirdMethod = function(msg){this._output(msg);}; 
    CustomClassB.prototype._output = function(m){return console.log(m + this.message);}; 

それとも、あなたはより多くの糖衣構文をしたい場合、あなたはプロトタイプをコピーして使用しているextendのような呼び出し構文と、それにオブジェクトをマージする便利な関数を作成することができます。私は必ずしもそれをFunction.prototypeに添付することを推奨するとは限りません。サードパーティ製のコードと衝突する可能性が高いからです。


古いブラウザはObject.createをサポートしていません。あなたは、従来のブラウザをサポートする必要がある場合、あなたはそれをエミュレートするために、このような関数を書くことができます:

function objectCreate(o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
} 

、これはどのように進化したかを見ためhereを参照してください。

+0

ありがとうございます返信、私は取得し続けています:7Uncaught TypeError:Object function Object(){[ネイティブコード]}に 'clone'メソッドがありません –

+0

これは 'Object.create'です。新しく、約3行のjavascript(http://javascript.crockford.com/prototypal.html)でエミュレートすることができますが、私は通常、同じ目的を果たすために 'clone'という名前の関数を書いています。 –

+0

@SimonDavies Object.createは古いブラウザではサポートされていないため、次の回避策を使用すると意味があります。http://stackoverflow.com/questions/5199126/javascript-object-create-not-working-in-firefox – zatatatata