2010-12-08 10 views
17

"プロトタイプ"ではなく "this"のプロパティとしてメソッド "area"を定義することとの違いは何ですか?このVs.プロトタイプ

」:Prototypes and InheritanceChapter 9 , part 1のセクションでJavaScript - The definitive guide

//console.clear() 

function Rectangle(w, h) 
{ 
    this.width = w; 
    this.height = h; 
    this.area = function() { return this.width * this.height; } 
} 


var r = new Rectangle(2, 3); 
var a = r.area(); 

//console.log(a) 

function Square(s) 
{ 
    this.side= s; 
} 

Square.prototype.area = function(){return this.side * this.side; } 

var r = new Square(2); 
var a = r.area(); 

//console.log(a) 

は、著者は、プロトタイプオブジェクトの内部でメソッド「エリア」を定義することは有益であるが、彼の説明は本当に理解できなかったことを述べています。 。すべての1つのRectangleの領域が のオブジェクトは常に同じ 関数を参照しています(誰かがそれを変更する可能性がありますが、 コースですが、通常はオブジェクトのメソッド を定数とします)。 同じクラスのすべてのオブジェクト (つまり、同じ のすべてのオブジェクトが同じ コンストラクタで作成されたオブジェクト)で共有されることを目的とした のメソッドに対しては、通常の プロパティを使用するのに非効率的です。

私はこの質問がほとんどthisのように見えることは知っていますが、そうではありません。

答えて

26

whatever = function() { ... }で関数を定義すると、その関数が関数を定義する関数のローカル変数にアクセスできる「クロージャ」を作成する傾向があります。 this.fn = function() { ... }と言うと、各オブジェクトは関数のインスタンス(および新しいクロージャ)を取得します。これはJavascriptで「プライベート」変数を作成するためによく使用されますが、コストはかかります。各オブジェクト内の各関数は区別され、より多くのメモリを消費します。

Rectangle.prototype.fn = function() { ... }と言うとき、関数の1つのインスタンスはすべてRectangleで共有されます。これによりメモリが節約され、クロージャーをひどく処理するブラウザでのメモリリークを最小限に抑えることができます。 「private」メンバや定義関数のローカル変数へのアクセスが必要ない場合は、通常はより良い考えです。

+3

技術的に言えば、function(){...}は、何に割り当てられているかにかかわらず、常にクロージャを作成します。他のすべては素晴らしいよ! – ide

+0

@ide:良い点。編集されました。 :) – cHao

+0

@ide:説明のみんなありがとう!また、これについてもっと知ることができる場所を教えてください。 – instantsetsuna