0

今日、私は 2 つの異なるタイプの Javascript 関数宣言を見ました。この 2 つをより深く理解したいと思います。

function Car( model, year, miles ){
   this.model = model;
   this.year    = year;
   this.miles  = miles;
}

/*
 Note here that we are using Object.prototype.newMethod rather than 
 Object.prototype so as to avoid redefining the prototype object
*/
Car.prototype.toString = function(){
    return this.model + " has done " + this.miles + " miles";
};

var civic = new Car( "Honda Civic", 2009, 20000);
var mondeo = new Car( "Ford Mondeo", 2010, 5000);

console.log(civic.toString());

およびタイプ 2:

function Car( model, year, miles ){
   this.model = model;
   this.year    = year;
   this.miles  = miles;
   this.toString = function(){
       return this.model + " has done " + this.miles + " miles";
   };
}


var civic = new Car( "Honda Civic", 2009, 20000);
var mondeo = new Car( "Ford Mondeo", 2010, 5000);

console.log(civic.toString());

具体的には「prototype」と「this.toString」です。

JS の知恵の真珠を教えてくれる人はいますか?

4

2 に答える 2

6

ここでの主な違いは、メソッド 2 では、Car の新しいインスタンスを作成するたびにメソッドを再定義していることです。これは技術的にパフォーマンスが低下します。

ただし、方法 2 が提供する良い点の 1 つは、次のように、真にプライベートなインスタンス変数を作成できることです。

function Person( _age ){
    var age = _age;
    this.canDrink = function(){
        return age >= 21;
    }
}

var p = new Person(25);
p.canDrink() // true
p.age // undefined, because age is not exposed directly

方法 1 のもう 1 つの利点 (パフォーマンス以外) は、オブジェクトのすべてのインスタンスの機能を変更できることです。例えば:

function Person( _age ){
    this.age = _age;
}
Person.prototype.canDrink = function(){
    return this.age >= 21;
}

var a = new Person(15),
    b = new Person(25);
a.canDrink() // false
b.canDrink() // true

Person.prototype.canDrink = function(){ return true }
a.canDrink() // true
b.canDrink() // true

これは、方法 2 では不可能です (インスタンスごとに変更する必要はありません)。ただし、年齢は現在公開されています。

a.age // 15
b.age // 25
于 2012-04-21T23:06:01.297 に答える
0

this.toStringコンストラクター内で定義する必要があり、Car クラスでのみ検出されます (特に子クラスに含まれていない限り)。

Car.prototype.toStringコンストラクターの外部で定義でき、Car クラスから継承するクラスのプロトタイプで見つかります。

于 2012-04-21T22:56:02.517 に答える