Snippet1を使用して定義された方法との違い:次の二つ
var box = function() {};
box.prototype.open = function {
};
Snippet2:
var box = function() {
this.open = function() {
};
}
これら二つの間の任意の差、一つは良いですか?
Snippet1を使用して定義された方法との違い:次の二つ
var box = function() {};
box.prototype.open = function {
};
Snippet2:
var box = function() {
this.open = function() {
};
}
これら二つの間の任意の差、一つは良いですか?
box
はコンストラクタなので、new box()
を実行しているとしますか?
もしそうなら...
最初のバージョンはbox
コンストラクタから作成されたすべてのオブジェクト間open
機能を共有します。
2番目のオブジェクトは、box
コンストラクタから作成されたすべてのオブジェクトに対して新しい関数オブジェクトを生成します。
このように、最初のメモリは2番目のメモリよりも効率的です。
最初のバージョン:
new box box prototype object prototype
+--------------+ +--------------+ +--------------+
| | | | | |
| |--------->| open func |--------->| |
| | /| | | |
+______________+ / +______________+ +______________+
/
/
new box /
+--------------+/
| |/
| |/
| |
+______________+
セカンドバージョン:
new box box prototype object prototype
+--------------+ +--------------+ +--------------+
| | | | | |
| open func |--------->| |--------->| |
| | /| | | |
+______________+ / +______________+ +______________+
/
/
new box /
+--------------+/
| |/
| open func |/
| |
+______________+
@amはない私は正しいです。最初の方法は効率的な方法です。 2番目の方法は、プライベート変数が必要な場合に便利です。
var box = function() {
var _message = "hello world";
this.func2 = function(){
console.log(_message); // prints hello world
}
};
box.prototype.func1 = function() {
this.func2(); // prints hello world
console.log(_message); // throws ReferenceError: _message is not defined
};
+1は、各オブジェクトに固有の機能を割り当てる有効なユースケースを提供するためのものです。 –
しかし、(明示的に言っていないので)2番目の方が何らかの理由でより適切です_非常に一般的な状況ではなく、各インスタンスごとに個別に関数を定義する必要があります。 – nnnnnn
@nnnnnn:はい、良い点です。確かに、関数をコンストラクタで作成し、直接代入する有効な機会があります。 –