簡體   English   中英

創建新的 class 實例時如何繞過構造函數調用

[英]How to bypass constructor call when creating a new class instance

我想在不調用其構造函數的情況下創建 class 的實例。

例如,

class Test {
    private greeting: string = "Hello";

    constructor() { 
        console.log("this should not happen"); 
    }

    foo() { 
        console.log(this.greeting + " world!"); 
    }
}

magic({greeting: "Hey"}, Test) instanceof Test // true

對於某些上下文,我正在處理 ORM。我需要它來創建 JavaScript 個對象,同時繞過構造函數。 這是在不需要工廠或無參數構造函數的情況下創建普通舊對象所必需的。

您正在尋找的“ magic ”可能是Object.create function:

let t = Object.create(Test.prototype, {
    greeting: {
        value: "Hey",
        writable: true
    },
});

順便說一句,正如評論中所指出的,我認為您不應該跳過構造函數。 如果您真的需要,至少告訴我們您遇到的真正問題。

Object.setPrototypeOf 將完成大部分工作。

const rawObject = {greeting: 'Hey'};
const testInstance = Object.setPrototypeOf(rawObject, Test.prototype);

但是,請注意,此方法將覆蓋任何 getter/setter 方法。 使用它來提供基礎值。

例如,

class Test {
    _greeting;
    
    get greeting() {
        return this._greeting;
    }
}

const a = Object.setPrototypeOf({greeting: 'Hey'}, Test.prototype);
console.log(a.greeting); // Hey
a._greeting = 'Hello';
console.log(a.greeting); // Hey

const b = Object.setPrototypeOf({_greeting: 'Hey'}, Test.prototype);
console.log(b.greeting); // Hey
b._greeting = 'Hello';
console.log(b.greeting); // Hello

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM