スタックスペースと継承には2つの異なる問題がありますが、jsのような高水準のスクリプト言語では、おそらくガベージコレクションの仕組みはわからないでしょう。 1行のコード行の中間値は、その行が完了した後に破棄されます。
また、String.prototype.constructor
は、単にString
と同じになります。 String
の「インスタンス」は、String.prototype
を指す.__proto__
の参照を受け取り、継承チェーンを作成します。オブジェクトのプロパティがオブジェクトx
自身で定義されていないと判明した場合、JavaScriptはまずx.__proto__
で参照されるオブジェクト、次にx.__proto__.__proto__
、ほとんどの場合 - Object.prototype
によって参照されるオブジェクトを自動的にチェックします。
__proto__
は、JavaScriptインタープリタ間で実装が異なり、手動で操作しないでください。プロトタイプの魔法を説明するためにそのような参照が存在することは知っているのは良いことですが、オブジェクトの__proto__
参照を直接変更する必要はありません。代わりに、new
演算子、またはObject.create
のいずれかでクラスのインスタンスを作成する必要があります。 JavaScriptでフルスーパー/サブクラス関係は次のようになります。
最後に
function Animal(name, weight){
this.name = name, this.weight = weight;
this.alive = true;
this.hungry = true;
}
// At this point you could put in Animal.prototype = Object.create(Object.prototype); but JavaScript will set it automatically, so it’s unnecessary
Animal.prototype.kill = function(){
this.alive = false;
}
Animal.prototype.feed = function(){
this.hungry = false;
}
function Cat(name, weight){
Animal.call(this, name, weight);
this.lives = 9;
}
// Sometimes people instance a new parent like
// Cat.prototype = new Animal('doesntmatter', 420);
// The result is the same except that using Object.create saves the overhead
// of running a full constructor for an object that doesn’t need it
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.kill = function(){
this.lives--;
if(this.lives <= 0) this.alive = false;
};
var a = new Animal();
var c = new Cat();
/* a.feed and b.feed now reference the same function object,
but c.kill has been overridden since its prototype `__proto__` chain first
visits Cat.prototype, then Animal.prototype, then Object.prototype. */
を、ES6は、このシステムのための構文糖であるclass
キーワードを紹介し、init
メソッドにコンストラクタを抽象化します。