2012-03-20 4 views
0
var Animal = function(config) { 
    config = config || {}; 
    var name = config.name, 
     numLegs = config.numLegs, 
     weight = config.weight, 
     speed = config.speed, 
     sound = config.sound 
    return { 
     getName: function() { 
      return name; 
     }, 
     getNumLegs: function() { 
      return numLegs; 
     }, 
     getWeight: function() { 
      return weight; 
     }, 
     getSpeed: function() { 
      return speed; 
     }, 
     getSound: function() { 
      return sound; 
     }, 
     run: function(distance, unit) { 
      unit = unit || 'miles'; 
      return 'The ' + name + ' ran ' + distance + ' ' + unit; 
     }, 
     speak: function() { 
      return 'The ' + name + ' says "' + sound + '"'; 
     } 
    } 
}; 

function DragonFly(config) { 
    var me = {}, 
     numWings = config.numWings; 
    me.prototype = new Animal(config); 
    me.getNumWings = function() { 
     return numWings; 
    }; 
    me.fly = function(distance, unit) { 
     unit = unit || 'miles'; 
     return 'The ' + me.name + ' flew ' + distance + ' ' + unit; 
    } 
    return me; 
} 

var dragonFly = new DragonFly({ 
    numWings: 2, 
    name: 'DragonFly', 
    numLegs: 6 
}); 

PHPの背景から来て、私はJavaScriptの継承を1ビット分理解できず、助けてください。コンストラクタメソッドでJavaScriptで継承を使用する方法プライベートプロパティでオブジェクトリテラルを返すか?

は基本的に、ここで私はトンボオブジェクトのインスタンスで行うことができるようにしたいものです。

dragonFly.getName(); // 'DragonFly' 
dragonFly.fly(1, 'mile'); // 'The dragonfly flew 1 mile'; 
dragonFly.run(1, 'yard'); // 'The dragonfly ran 1 yard'; 

私はまた、メソッドをオーバーライドし、オーバーライドし、それらの親を呼び出す方法を知りたいですメソッド。私のアプローチで何が間違っていますか?上記の例はすべてundefinedを返すか、エラーをスローします。私がオブジェクトリテラルスタイルを使用した主な理由は、プロパティをプライベートにすることができるためです。

+0

あなたの 'dragonfly.getName()'に入力ミスがあります。 – Joseph

+0

@Joseph Fixed。ありがとう。 –

答えて

2

「最速」の方法:あなたのスクリプトで「継承」の2種類、「古典」の継承と原型継承を混合している

var Animal = function(config) { 
config = config || {}; 
var name = config.name, 
    numLegs = config.numLegs, 
    weight = config.weight, 
    speed = config.speed, 
    sound = config.sound 
return { 
    getName: function() { 
     return name; 
    }, 
    getNumLegs: function() { 
     return numLegs; 
    }, 
    getWeight: function() { 
     return weight; 
    }, 
    getSpeed: function() { 
     return speed; 
    }, 
    getSound: function() { 
     return sound; 
    }, 
    run: function(distance, unit) { 
     unit = unit || 'miles'; 
     return 'The ' + name + ' ran ' + distance + ' ' + unit; 
    }, 
    speak: function() { 
     return 'The ' + name + ' says "' + sound + '"'; 
    } 
    } 
}; 

function DragonFly(config) { 
var me = new Animal(config); 
var numWings = config.numWings; 
me.getNumWings = function() { 
    return numWings; 
}; 
me.fly = function(distance, unit) { 
    unit = unit || 'miles'; 
    return 'The ' + me.name + ' flew ' + distance + ' ' + unit; 
} 
return me; 
} 

var dragonFly = new DragonFly({ 
numWings: 2, 
name: 'DragonFly', 
numLegs: 6 
}); 

、あなたはあなたがなりたいしない限り、それを行うカント深刻なトラブル。両方の仕事は、両方とも賛否両論があります。あなたがそれから始まって以来、 "古典的な"継承、またはオブジェクトの拡張に固執する。

オブジェクトリテラルにはプロトタイプがありません。関数にはプロトタイプがあります。 JSが「本当に」オブジェクト指向イマイチ理由私の意見ではそれがありますが、良いexerciceは現在機能してプロトタイプを使用しようとするだろう、私はあなたがプライベートフィールドを作成することができますかわからないけれども、それは、オブジェクト指向langages

を模倣することができますそれと。

編集:me.nameはme.getName()である必要があります。名前は「プライベート」なので、おもう。

+0

清算していただきありがとうございます。同じメモで、オーバーライドされたメソッド/呼び出し元の親メソッドをオーバーライドする方法はありますか? –

+0

ええと、私は古典的な継承を使ってはいけません。私はあなたができることを確信していません。私は秘密を落としてプロトタイプの継承を使用しなければならないので、プロトタイプチェーンを後ろに進めることができます。そのウェブサイトを見てください:http://www.crockford.com/javascript/inheritance.html、編集:ES5でObject.createを見てください。 – mpm

関連する問題