VUE3.0 をすぐに使い始める方法: 学習の
new
機能とは何ですか?
new
演算子は、ユーザー定義のオブジェクト型、またはコンストラクターを持つ組み込みオブジェクト型の 1 つのインスタンスを作成します。
定義を見ただけではまだ少しわかりにくいですが、 JavaScript
のnew
の機能を理解するために具体的な例を見てみましょう。
: // 実生活では体重を減らすことはできませんが、オンラインではスリムな状態を維持する必要があります function Thin_User(name, age) { this.name = 名前; this.age = 年齢; } Thin_User.prototype.eatToMuch = function () { // 空想して太い涙を残す console.log('たくさん食べるのに、とても痩せている!!!'); } Thin_User.prototype.isThin = true; const xiaabao = new Thin_User('zcxiaabao', 18); console.log(xiaabao.name); // zcxiaabao コンソール.log(xiaabao.age); // 18 console.log(xiaabao.isThin); // true // たくさん食べますが、とても痩せています!!! xiaabao.eatToMuch();
上記の例から、 xiaobao
Thin_User
Thin_User.prototype
のプロパティにアクセスし、より簡単に記述して、 new
のことを実行できることがわかります。
__proto__->Thin_User.prototype
this
新しいオブジェクトにポイントしてnew
はキーワードなので、配列をシミュレートする上位メソッドのようにオーバーライドすることはできません。 new
効果をシミュレートする関数createObject
。使用法は次のとおりです:
function Thin_User(name, age) {} const u1 = 新しい Thin_user(...) const u2 = createObject(Thin_User, ...a)
上記の分析によると、 createObject
記述するための一般的な手順は次のとおりです。
obj
を作成しobj.__proto__->constructor.prototype
を設定します (ただし、JavaScript は推奨しません) __proto__ 属性を直接変更する場合、特にプロトタイプを変更するために setPrototypeOf メソッドが提供されます。constructor.call/constructor.call/apply(obj, ...)
使用して属性をobj
に追加し、obj
__proto__和prototype
完全に理解することができます。プロトタイプとプロトタイプチェーン。
call/apply
については、call と apply に関する JavaScript チュートリアルを参照してください。
これらを学習した後、最初のバージョンのコードを作成できます。
function createObject(Con) { // 新しいオブジェクト obj を作成します // var obj = {} ; var obj = Object.create(null); とすることもできます。 // obj.__proto__ -> コンストラクター プロトタイプを変換 // (非推奨) obj.__proto__ = Con.prototype Object.setPrototypeOf(obj, Con.prototype); //コンストラクタを実行 Con.apply(obj, [].slice.call(arguments, 1)); // 新しいオブジェクトを返します return obj;}
ご存知のとおり、関数には戻り値があるため、コンストラクターに戻り値がある場合、 new
? の最終実行後に返される結果は何ですか。
仮定して、コンストラクターの戻り値が基本型であると仮定して、最終的な戻り値を見てみましょう。
function Thin_User(name, age) { this.name = 名前; this.age = 年齢; 「私は永遠に痩せ続けます」を返します。 } Thin_User.prototype.eatToMuch = function () { console.log('たくさん食べますが、とても痩せています!!!'); } Thin_User.prototype.isThin = true; const xiaabao = new Thin_User('zcxiaabao', 18); console.log(xiaabao.name); // zcxiaabao コンソール.log(xiaabao.age); // 18 console.log(xiaabao.isThin); // true // たくさん食べますが、とても痩せています!!! xiaabao.eatToMuch();
最終的な戻り値は、コンストラクターが戻り値を処理しないようです。
心配しないで、戻り値がオブジェクトである状況のテストを続けてみましょう。
関数 Thin_User(name, age) { this.name = 名前; this.age = 年齢; 戻る { 名前: 名前、 年齢: 年齢 * 10、 脂肪:本当 } } Thin_User.prototype.eatToMuch = function () { // 空想して太い涙を残す console.log('たくさん食べるのに、とても痩せている!!!'); } Thin_User.prototype.isThin = true; const xiaabao = new Thin_User('zcxiaabao', 18); // エラー: xiaabao.eatToMuch は関数ではありません xiaabao.eatToMuch();
eatToMuch
を実行すると、コンソールにエラーが直接報告され、現在の関数がなかったので、 xiaobao
オブジェクトを出力しました。
xiaobao
オブジェクトのage
が変更され、コンストラクターの戻り値とまったく同じfat
属性が追加されていることがわかりました。
これら 2 つの例を読むと、コンストラクターが値を返すときの状況を基本的に明確にすることができます。つまり、コンストラクターがオブジェクトを返すとき、そのオブジェクトは直接返されます。
関数 createObject(Con) { // 新しいオブジェクト obj を作成します // var obj = {} ; var obj = Object.create(null); とすることもできます。 // obj.__proto__ -> コンストラクター プロトタイプを変換 // (非推奨) obj.__proto__ = Con.prototype Object.setPrototypeOf(obj, Con.prototype); //コンストラクタを実行し、コンストラクタの戻り値を受け取ります const ret = Con.apply(obj, [].slice.call(arguments, 1)); // コンストラクターの戻り値がオブジェクトの場合は、そのオブジェクトを直接返します // それ以外の場合は、obj を返します return typeof(ret) === 'オブジェクト' ret: obj;}