下一个决定的问题... 我有一个对象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);
但是我有一些我不明白的麻烦。该代码不起作用。我无法获得新的全名。我认为我对数组方法没有足够的了解。 请帮助我修复此代码。谢谢!
答案 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。
代码存在的问题是:
您正在使用slice
并返回结果(数组),但实际上您想要做的是访问索引为0
(名字)的数组中的条目或1
(姓)。
您使用的是splice
的返回值,该返回值是已删除项(而不是其余项)的数组。
您没有在设置器中设置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);