在构造函数的构造函数中未调用setter中的验证

时间:2018-11-20 20:27:47

标签: javascript

具有以下构造函数:

function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;

    Object.defineProperty(this, 'lastName', {
        get() {
            return lastName;
        },

        set(value) {
            if (!value) {
                throw new Error('Last name is required');
            }

            lastName = value;
        }
    });

    Object.defineProperty(this, 'fullName', {
        get() {
            return `${this.firstName} ${this.lastName}`;
        }
    });
}

在这里我希望调用该错误,因为我在构造函数中省略了lastName属性的值

try {
    let person = new Person('john');

    console.log(person.fullName);
} catch (error) {
    console.log(`ValidationError: ${error.message}`);
}

但是我却得到了输出john undefined

调用错误的唯一方法是如果我从对象中显式调用了属性。

try {
    let person = new Person();

    person.firstName = 'john';
    person.lastName = '';

    console.log(person.fullName);
} catch (error) {
    console.log(`ValidationError: ${error.message}`);
}

我在这里收到预期的消息ValidationError: Last name is required

在构造函数中进行设置时,执行验证的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

在构造器中设置属性后,在 中定义lastName getter / setter对。要使其工作,首先 定义属性,然后进行设置。或者您只是这样做:

 function Person(firstName, lastName) {
    if(!lastName) throw new Error("lastName is required");

    this.firstName = firstName;
    this.lastName = lastName;
}