Javascriptの関数にプロトタイプ継承を適用しようとしています。それはすべてかなり平凡で、さらにWikipedia's javascript lemmaで説明されています。 Employee.prototype = new Person();
でjavascriptプロトタイプの継承とオブジェクトのプロパティ
function Person() {
this.age = 0;
this.location = {
x: 0,
y: 0,
absolute: false
};
};
function Employee() {};
Employee.prototype = new Person();
Employee.prototype.celebrate = function() {
this.age++;
}
var pete = new Employee();
pete.age = 5;
pete.celebrate();
var bob = new Employee();
bob.celebrate();
console.log("bob is " + bob.age + " pete is " + pete.age);
、すべての人のプロパティと(プロトタイプ化)メソッドを継承の基本である従業員に継承されています。それは私の性質が簡単なjavascriptの種類である場合に動作します。
これは期待通りに動作します:直感的なコントラあるtrue
を、(:私はピートの場所をいじるために始めている今、bob is 1 pete is 6
pete.celebrate();
pete.location.absolute=true;
表示bob.location.absoluteを示し(祝った後)私はボブの場所に触れなかったので、それはPerson
で宣言された初期値を持つと期待しています。
これは私の最初の理解では間違っていたはずです。私はおそらく最初のPersonから位置オブジェクトをクローン化するべきであることを認識していますが、これを行う場所や方法はわかりません。 そして、おそらく継承のためのより良いテクニックがあれば?
新しいPerson()ではなくcreateObject(Person)を使用することのメリットは何ですか?プロトタイプ間接参照の1つのレイヤーしか追加しません。 – Kosta
@Kostaは、継承時にコンストラクタを実行することによる副作用を回避します。コンストラクターには初期化コードがありますが、何もインスタンス化していないときには実行したくない場合があります。 'Person.prototype'と' f.prototype'の両方が同じオブジェクトを指しているので、 'new Employee'は' instanceof Person'です。 – Esailija
しかし、あなたはまだcreateObject()(一度)でコンストラクタを実行しています。また、コンストラクタをEmployee()(各インスタンシエーションごとに)で実行しています。 createObject()が役に立つ例を挙げてください。 – Kosta