获取和设置Javascript中的属性

时间:2019-07-19 16:31:50

标签: javascript

下一个决定的问题... 我有一个对象User,其中仅包含1个属性:

function User(fullName) {
  this.fullName = fullName;
}

名字和姓氏仅由空格分隔。 我需要做(get)可用的firstName和lastName属性,并且必须可以通过(set)更改属性。 例如:

var vasya = new User("Vasya Popkin");

// reading firstName/lastName
alert( vasya.firstName ); // Vasya
alert( vasya.lastName ); // Popkin

// writing в lastName
vasya.lastName = 'Black';

alert( vasya.fullName ); // Vasya Black

fullName必须保留为属性。

我的代码:

function User(fullName) {
    this.fullName = fullName;
    Object.defineProperty(this, "firstName", {
        get: function () {
            return this.fullName.split(' ').slice(0, 1);
        },
        set: function (value) {
            fullName.split(' ').splice(0, 1, value).join(' ');
        }
    });
    Object.defineProperty(this, "lastName", {
        get: function () {
            return this.fullName.split(' ').slice(1);
        },
        set: function (value) {
            this.fullName.split(' ').splice(1, 1, value).join(' ');
        }
    });
}

var vasya = new User("Vasya Popkin");

console.log(vasya.fullName);
console.log(vasya.lastName);
console.log(vasya.firstName);
vasya.lastName = 'Black';
vasya.firstName = 'Jack';
console.log(vasya.fullName);
console.log(vasya.firstName);
console.log(vasya.lastName);

但是我有一些我不明白的麻烦。该代码不起作用。我无法获得新的全名。我认为我对数组方法没有足够的了解。 请帮助我修复此代码。谢谢!

2 个答案:

答案 0 :(得分:0)

  • 您没有在fullName中设置set属性
  • splice返回数组中已删除的项目。因此,对join返回的值使用splice无效;

因此,您需要更改set逻辑以结合更多类似的步骤:

function User(fullName) {
  this.fullName = fullName;
  Object.defineProperty(this, "firstName", {
    get: function() {
      return this.fullName.split(' ')[0];
    },
    set: function(value) {
      var names = this.fullName.split(' '); // array of 2 names
      names.splice(0, 1, value); // update the array
      this.fullName = names.join(' '); // set full name
    }
  });
  Object.defineProperty(this, "lastName", {
    get: function() {
      return this.fullName.split(' ')[1];
    },
    set: function(value) {
      var names = this.fullName.split(' ')
      names.splice(1, 1, value)
      this.fullName = names.join(' ');
    }
  });
}

var vasya = new User("Vasya Popkin");

console.log(vasya.fullName);
console.log(vasya.lastName);
console.log(vasya.firstName);

vasya.lastName = 'Black';
vasya.firstName = 'Jack';

console.log(vasya.fullName);
console.log(vasya.firstName);
console.log(vasya.lastName);

答案 1 :(得分:0)

前言:请参阅my comment

代码存在的问题是:

  1. 您正在使用slice并返回结果(数组),但实际上您想要做的是访问索引为0(名字)的数组中的条目或1(姓)。

  2. 您使用的是splice的返回值,该返回值是已删除项(而不是其余项)的数组。

  3. 您没有在设置器中设置fullName属性。 (分配由split生成的数组中的条目不会更改split从中创建数组的字符串。)

我不会尝试使用单一代码来做到这一点(有可能,这更难理解,调试和维护)。查看对firstName的评论(lastName就是同一类东西,但是要处理没有空间的情况):

function User(fullName) {
    this.fullName = fullName;
    Object.defineProperty(this, "firstName", {
        get: function () {
            // Return just the part at index 0 of the array after split
            return this.fullName.split(' ')[0];
        },
        set: function (value) {
            // Split into parts
            var parts = this.fullName.split(' ');
            // Set the first part
            parts[0] = value;
            // Join back into a string
            this.fullName = parts.join(' ');
        }
    });
    Object.defineProperty(this, "lastName", {
        get: function () {
            return this.fullName.split(' ')[1] || "";
        },
        set: function (value) {
            var parts = this.fullName.split(' ');
            parts[1] = value;
            this.fullName = parts.join(' ');
        }
    });
}

var vasya = new User("Vasya Popkin");

console.log(vasya.fullName);
console.log(vasya.lastName);
console.log(vasya.firstName);
vasya.lastName = 'Black';
vasya.firstName = 'Jack';
console.log(vasya.fullName);
console.log(vasya.firstName);
console.log(vasya.lastName);