JavaScript の new 演算子は、ユーザー定義のオブジェクト型のインスタンス、またはコンストラクターを使用して組み込みオブジェクトのインスタンスを作成します。この記事ではNEWの実装原理と書き換え方法を紹介します。
new に関しては、次のようなクラスとインスタンスに必ず関連付けられます。
function Func() { let x = 100; this.num = x +} let f = new Func();
上記のコードでは、まず関数を作成します。オブジェクト指向の用語では、 のインスタンスを作成します。関数クラス。この関数を直接実行する場合は通常の関数です。new で実行する場合、この関数はカスタム クラスと呼ばれます。
通常の関数実行の場合、次のようないくつかのことを実行します:
新しい実行コンテキスト EC (実行コンテキスト実行環境) を形成する
AO (Activation Object) 変数オブジェクトを形成する、引数を初期化する仮パラメータ割り当て
スコープチェーンの初期化
コード実行
新しい関数実行の場合、通常の関数実行側と独自の関数実行側の両方があります:
デフォルトでは、オブジェクトが作成され、このオブジェクトは現在のクラスのインスタンスです。
return を書くかどうかに関係なく、その this ポインタを宣言します。新しく作成されたインスタンスは Return になります。ここで特別な点があり、ユーザーがコンテンツを自分で返し、戻り値が参照型の値である場合、デフォルトで返されたインスタンスは上書きされ、戻り値は戻り値ではなくなります。クラスのインスタンス
console.log(f); //=>{num:200} //f是Func这个类的实例 //相当于给创建的实例对象新增一个num的属性 obj.num=200 (因为具备普通函数执行的一面,所以只有this.xxx=xxx才和创建的实例有关系,此案例中的x只是AO中的私有变量) console.log(f instanceof Func); //=>TRUE instanceof用来检测某一个实例是否属于这个类
new が登場するたびに、新しいインスタンス オブジェクトが作成されます
console.log(f === f2); //=>false
/* * 内置NEW的实现原理 * @params * Func:操作的那个类 * ARGS:NEW类的时候传递的实参集合 * @return * 实例或者自己返回的对象 */ function _new(Func, ...args) { //默认创建一个实例对象(而且是属于当前这个类的一个实例) let obj = {}; //也会把类当做普通函数执行 //执行的时候要保证函数中的this指向创建的实例 let result = Func.call(obj, ...args); //若客户自己返回引用值,则以自己返回的为主,否则返回创建的实例 if ((result !== null && typeof result === "object") || (typeof result === "function")) { return result; } return obj; }
let f3 = _new(Func); console.log(f3); // =>{num: 200}
Func.prototype.log = function () { console.log('ok'); } let f4 = _new(Func); f4.log(); //=>Uncaught TypeError: f4.log is not a function
/* * 内置NEW的实现原理 * @params * Func:操作的那个类 * ARGS:NEW类的时候传递的实参集合 * @return * 实例或者自己返回的对象 */ function _new(Func, ...args) { //默认创建一个实例对象(而且是属于当前这个类的一个实例) // let obj = {}; let obj = Object.create(Func.prototype); //也会把类当做普通函数执行 //执行的时候要保证函数中的this指向创建的实例 let result = Func.call(obj, ...args); //若客户自己返回引用值,则以自己返回的为主,否则返回创建的实例 if ((result !== null && typeof result === "object") || (typeof result === "function")) { return result; } return obj; }
let f6 = _new(Func); f6.log(); //=>ok
js チュートリアル
コラムからのものです。学習へようこそ!以上がJSにおけるNEWの実装原理と書き換え方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。