gpt4 book ai didi

javascript - 我可以让一个类实例返回另一个类实例吗?

转载 作者:行者123 更新时间:2023-11-28 15:11:16 25 4
gpt4 key购买 nike

我试图让一个对象返回另一个对象并将一些数据传递给所有微实例。这就是我想要实现的目标。

export class Macro {
constructor(props) {
return (props) => {
return Micro(props)
}
}
}

export class Micro {
constructor(props) {
this.macro = props
}
}

let MicroInstance = new Macro({'happy': true})
let instance = new MicroInstance()
console.log(instance.macro.happy) // true

这会引发错误:

  _classCallCheck(this, Macro);
^

ReferenceError: Macro is not defined

更新1)

这是一个更现实的用例。我正在尝试创建一个使用定义类中的信息的自定义错误对象,这样我就不必不断将所有相同的参数传递给 LangError 类。

let languages = {
"en": {
"login_errors": {
"invalid_name": "Invalid Name: {name}!"
}
},
"jp": {
"login_errors": {
"invalid_name": "無効な名前: {name}"
}
},
"es": {
"login_errors": {
"invalid_name": "Nombre no válido: {name}!"
}
}
}

let LangError = new LangErrorDefinition({languages, nestedLocalesProp: 'login_errors'})
let error = new LangError('invalid_name', { name: 'Thomas' })
console.log(error.messages)

// { en: 'Invalid Name: Thomas!',
// jp: '無効な名前: Thomas',
// es: 'Nombre no válido: Thomas!' }

更新2)

使用Jonathan Lonowski的答案,它在这里有效jsfiddle .

class Macro {
constructor(props) {
return () => {
return new Micro(props)
}
}
}

class Micro {
constructor(props) {
this.macro = props
}
}

let MicroInstance = new Macro({'happy': true})
let instance = new MicroInstance()
console.log(instance.macro.happy) // true

但是它仍然在我的本地文件中给我一个 babel 错误。

/Users/thomasreggi/Desktop/project/test/error-suite.js:99
_classCallCheck(this, Macro);
^

ReferenceError: Macro is not defined
at new Macro (error-suite.js:94:7)
at Object.<anonymous> (error-suite.js:108:21)
at Module._compile (module.js:398:26)
at loader (/Users/thomasreggi/.nvm/versions/node/v5.3.0/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:130:5)
at Object.require.extensions.(anonymous function) [as .js] (/Users/thomasreggi/.nvm/versions/node/v5.3.0/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:140:7)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Function.Module.runMain (module.js:430:10)
at /Users/thomasreggi/.nvm/versions/node/v5.3.0/lib/node_modules/babel-cli/lib/_babel-node.js:161:27
at Object.<anonymous> (/Users/thomasreggi/.nvm/versions/node/v5.3.0/lib/node_modules/babel-cli/lib/_babel-node.js:162:7)

更新3)

上述错误是由于推荐日语字符造成的,我使用的是 babel-node2015react 预设。

https://gist.github.com/reggi/cb9e83ce74de17da1ca2935b0bb3ff1d

最佳答案

不是真的。当构造函数返回任何对象(包括函数)时,new 将按原样返回该对象,而不是它创建的实例

console.log(MicroInstance instanceof Macro);    // false
console.log(MicroInstance instanceof Function); // true

尽管考虑到这一点,Macro(或LangErrorDefinition)可能只是一个函数,它返回的可能是一个新类(例如,ModifiedMicro )。

这仍然可以通过继承(extends)来使用 Micro,以避免为创建的每个 ModifiedMicro 重新定义类的大部分内容一个闭包()。

export class Micro {
constructor(props, ...args) {
this.macro = props;
this.micro = args;
}
}

export function Macro(props) {
return class ModifiedMicro extends Micro {
constructor(...args) {
super(props, ...args);
}
};
}

let MicroInstance = Macro({'happy': true}) // no need for `new`
let instance = new MicroInstance('one', 'two')

console.log(instance.macro.happy) // true
console.log(instance.micro) // ['one', 'two']

console.log(instance instanceof Micro); // true
<小时/>

[原答案]

构造函数当前有 2 个问题:

  1. props 参数声明了两次。

    constructor(props) {   // 1st
    return (props) => { // 2nd
    // ...
    }
    }

    由于变量遮蔽,第二个声明将提供给 Micro(props),但在您的使用中只有第一个声明被赋予了值:

    let MicroInstance = new Macro({'happy': true}) // 1st
    let instance = new MicroInstance(/* props */) // 2nd
  2. 返回 Micro(props) 时缺少 new:

    return new Micro(props)

    如果没有这个,您应该会看到一个TypeError:

    Class constructor Micro cannot be invoked without 'new'

根据这些进行调整,console.log() 应按照您的预期报告 true:

export class Macro {
constructor(props) { // keep 1st `props`, removing 2nd
return () => {
return new Micro(props)
}
}
}

关于javascript - 我可以让一个类实例返回另一个类实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36365372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com