1. ホーム
  2. javascript

[解決済み] JavaScriptの「new」キーワードとは何ですか?

2022-03-18 11:48:14

質問

new というキーワードは、JavaScriptがオブジェクト指向のプログラミング言語ではないと思われがちなので、最初に遭遇したときはかなり混乱するかもしれません。

  • 何ですか?
  • どのような問題を解決するのですか?
  • どのような場合に適切で、どのような場合に適切でないか?

どのように解決するのですか?

5つのことをやっています。

  1. 新しいオブジェクトを作成します。 このオブジェクトの型は、単純に オブジェクト .
  2. この新しいオブジェクトの内部で、アクセスできないように設定します。 [プロトタイプ]]です。 (すなわち __proto__ ) プロパティを、コンストラクタ関数の外部でアクセスできるようにします。 プロトタイプ オブジェクトを作成します(すべての関数オブジェクトは、自動的に プロトタイプ プロパティがあります)。
  3. を作るのです。 this 変数が新しく作成されたオブジェクトを指すようにします。
  4. コンストラクター関数を実行し、新しく作成されたオブジェクトを使用します。 this が記載されています。
  5. コンストラクタの関数が非特権を返さない限り、新しく作成されたオブジェクトを返します。 null オブジェクトへの参照です。この場合、そのオブジェクト参照が代わりに返される。

コンストラクタ関数 の後の関数を指します。 new キーワードのように

new ConstructorFunction(arg1, arg2)

これが終わると、新しいオブジェクトの未定義のプロパティが要求された場合、スクリプトはそのオブジェクトの [プロトタイプ]] オブジェクトの代わりにそのプロパティを使用します。このようにして、JavaScriptで伝統的なクラス継承に似たものを得ることができるのです。

この中で一番難しいのは、2番のポイントです。 すべてのオブジェクト(関数を含む)には [プロトタイプ]]です。 . それは のみ オブジェクト作成時に 新しい を使用します。 Object.create またはリテラルに基づく(関数のデフォルトはFunction.prototype、数値はNumber.prototypeなど)。読み取ることができるのは Object.getPrototypeOf(someObject) . あるのは いいえ この値を設定したり読み取ったりする他の方法。

関数は、非表示の [プロトタイプ]]です。 というプロパティも持っています。 プロトタイプ そして、このオブジェクトにアクセスし、変更することで、作成したオブジェクトに継承されたプロパティやメソッドを提供することができるのです。


以下はその例です。

ObjMaker = function() {this.a = 'first';};
// ObjMaker is just a function, there's nothing special about it that makes 
// it a constructor.

ObjMaker.prototype.b = 'second';
// like all functions, ObjMaker has an accessible prototype property that 
// we can alter. I just added a property called 'b' to it. Like 
// all objects, ObjMaker also has an inaccessible [[prototype]] property
// that we can't do anything with

obj1 = new ObjMaker();
// 3 things just happened.
// A new, empty object was created called obj1.  At first obj1 was the same
// as {}. The [[prototype]] property of obj1 was then set to the current
// object value of the ObjMaker.prototype (if ObjMaker.prototype is later
// assigned a new object value, obj1's [[prototype]] will not change, but you
// can alter the properties of ObjMaker.prototype to add to both the
// prototype and [[prototype]]). The ObjMaker function was executed, with
// obj1 in place of this... so obj1.a was set to 'first'.

obj1.a;
// returns 'first'
obj1.b;
// obj1 doesn't have a property called 'b', so JavaScript checks 
// its [[prototype]]. Its [[prototype]] is the same as ObjMaker.prototype
// ObjMaker.prototype has a property called 'b' with value 'second'
// returns 'second'

クラス継承のようなものです。 new ObjMaker() も 'b' プロパティを継承しているように見えるでしょう。

サブクラスのようなものが欲しい場合は、このようにします。

SubObjMaker = function () {};
SubObjMaker.prototype = new ObjMaker(); // note: this pattern is deprecated!
// Because we used 'new', the [[prototype]] property of SubObjMaker.prototype
// is now set to the object value of ObjMaker.prototype.
// The modern way to do this is with Object.create(), which was added in ECMAScript 5:
// SubObjMaker.prototype = Object.create(ObjMaker.prototype);

SubObjMaker.prototype.c = 'third';  
obj2 = new SubObjMaker();
// [[prototype]] property of obj2 is now set to SubObjMaker.prototype
// Remember that the [[prototype]] property of SubObjMaker.prototype
// is ObjMaker.prototype. So now obj2 has a prototype chain!
// obj2 ---> SubObjMaker.prototype ---> ObjMaker.prototype

obj2.c;
// returns 'third', from SubObjMaker.prototype

obj2.b;
// returns 'second', from ObjMaker.prototype

obj2.a;
// returns 'first', from SubObjMaker.prototype, because SubObjMaker.prototype 
// was created with the ObjMaker function, which assigned a for us


私はこのテーマで大量のゴミを読み、最終的に以下のものを見つけました。 このページ 図解入りでとてもわかりやすく説明されています。