JSにおけるNEWの実装原理と書き換え方法

php中世界最好的语言
リリース: 2020-02-27 14:19:05
転載
3402 人が閲覧しました

JavaScript の new 演算子は、ユーザー定義のオブジェクト型のインスタンス、またはコンストラクターを使用して組み込みオブジェクトのインスタンスを作成します。この記事ではNEWの実装原理と書き換え方法を紹介します。

JSにおける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 が何をするかがわかったので、new をもう一度試してみましょう:
  • /* 
     * 内置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
ログイン後にコピー

つまり、Func プロトタイプのメソッドをそのインスタンスで呼び出すことはできません:

/* 
 * 内置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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート