【问题标题】:js get class of calling object in functionjs在函数中获取调用对象的类
【发布时间】:2017-12-07 19:25:06
【问题描述】:

我有一个类似这样的结构:

 class Person {
        greet() {
            console.log(this.constructor.name)
        }
    }

    class User extends Person {
    }

    let user = new User()
    user.greet()

不幸的是,它为this.constructor.name 打印window 而不是User。 还有其他方法可以获取实际的类名吗?

实际代码:

static MeteorMethod(target: MeteorModel, key: string, descriptor: PropertyDescriptor) {
        let constructor = target.constructor
        let className = target.constructor.name
        let methodName = key
        let method = descriptor.value
        let meteorMethodName = MeteorModelDecorators.generateMethodName(constructor, methodName)
        MeteorModelDecorators.MeteorMethodClasses[className] = target

        if(Meteor.isServer) {
            Meteor.methods({
                [meteorMethodName]: (modelClassName: string, modelProps: object, ...args: any[]) => {
                    let model = new MeteorModelDecorators.MeteorMethodClasses[modelClassName](modelProps)
                    method.apply(model, args)
                }
            })
        }
        else {
            descriptor.value = async function(...args: any[]) {
                // here I expect this to be Book, but I get Window
                return new Promise(function(resolve, reject) {
                    Meteor.call(meteorMethodName, this.constructor.name, this, args, (error: any, result: any) => {
                        if(error) reject(error)
                        resolve(result)
                    })
                })
            }
        }
    }

class MeteorModel {
    @MeteorMethod
    save() {
        console.log('save')
    }
}

class Book extends MeteorModel {
}

let book = new Book()
book.save()

【问题讨论】:

  • 使用new Promise((resolve, reject) => Meteor.call(... 而不是new Promise(function(resolve, reject) { Meteor.call(...

标签: javascript typescript decorator


【解决方案1】:

你的问题出在这部分:

descriptor.value = async function(...args: any[]) {
            // here I expect this to be Book, but I get Window
            return new Promise(function(resolve, reject) {
                Meteor.call(meteorMethodName, this.constructor.name, this, args, (error: any, result: any) => {
                    if(error) reject(error)
                    resolve(result)
                })
            })
        }

应该是这样的:

descriptor.value = async function(...args: any[]) {
            // With the arrow function, should be Book
            return new Promise((resolve, reject) => {
                Meteor.call(meteorMethodName, this.constructor.name, this, args, (error: any, result: any) => {
                    if(error) reject(error)
                    resolve(result)
                })
            })
        }

您传递给Promise 构造函数的函数正在设置一个新的上下文,通过使用箭头函数从周围的方法中获取this 上下文。

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多