2017-09-18 7 views
0

私はいくつかの文章で学んだことを書いて、プロトタイプとオブジェクトラッパーの仕組みを理解しています。私が間違っている場合は私を修正し、私は追加の詳細が欠落している場合はお知らせください。JavaScriptでプロトタイプとオブジェクトラッパーはどのように機能しますか?

JavaScriptは、プロトタイプを使用してオブジェクトのメソッドとプロパティを検索します。たとえば、プリミティブな文字列値である"Hello"という文字列を作成し、その上にメソッドsplit()"Hello".split())を適用しようとすると、文字列値はStringオブジェクトに変換され、split()メソッドを適用できます。このStringオブジェクトはString.prototype.constructorによって作成されます。作成後、JavaScriptはプロトタイプオブジェクトのsplit()メソッドを探します。メソッドが適用され、値が返されると、Stringオブジェクトは不要になり、ガベージコレクションの神に犠牲にされます。

答えて

2

スタックスペースと継承には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メソッドにコンストラクタを抽象化します。

関連する問題