如何重构对象属性的更新?

时间:2011-07-05 05:59:09

标签: javascript oop

我有一个JavaScript对象,这些属性主要是静态的。它们可以在施工时确定。但是,我还添加了一个方法“变形”来改变对象的状态。所以这些属性应该随之改变。

我在下面成功编写了它,作为方法(longNameMethod,没有问题)和作为属性(longNameProperty,有问题)。 longNameProperty的问题在于构造函数和morph方法中的代码看起来非常相似。有没有办法消除这种重复?

var Fruit = function (name) {
    this.name = name;

    this.longNameMethod = function () {
        return this.name + this.name;
    }

    this.longNameProperty = this.name + this.name;

    this.morph = function(name) {
        this.name = name;

        // starting to feel redundant
        this.longNameProperty = this.name + this.name;
    }

    // update(); // hypothetical solution
};

var item = new Fruit('apple');

console.log(item.longNameMethod()); // apple apple
console.log(item.longNameProperty); // apple apple

item.morph('orange');

console.log(item.longNameMethod()); // orange orange
console.log(item.longNameProperty); // orange orange

我尝试了一个“更新”方法来处理更新所有这些属性但由于某种原因我不能在构造期间使用它。它说this.name是未定义的。施工期间的操作顺序如何?

编辑:是的,方法方法和属性方法在功能上与外部相同,但目标是使用属性方法。

编辑^ 2:所以我认为有多个问题在起作用......其中一个解释如下:How does "this" keyword work within a function?

1 个答案:

答案 0 :(得分:1)

当您将方法分配到this

时,您需要在使用之前添加该方法
var Fruit = function (name) {
    this.morph = function(name) {
        this.name = name;

        this.longNameProperty = this.name + this.name;
    }

    this.morph(name);
};

var item = new Fruit('apple');

console.log(item.longNameProperty); // apple apple

item.morph('orange');

console.log(item.longNameProperty); // orange orange