我想知道为什么我需要下面的PhoneNumberFormatter.prototype.slice
方法。
为什么我不能在我的其他方法中使用slice(3,6).join('')
而无需添加PhoneNumberFormatter.prototype.slice
方法?当解释器在PhoneNumberFormatter对象上找不到方法时,它是否只是查找原型链以查找slice
并加入Array
原型?
function PhoneNumberFormatter(numbers) {
this.numbers = numbers;
}
PhoneNumberFormatter.prototype.render = function() {
var string = '';
string += this.parenthesize(this.getAreaCode());
string += ' ';
string += this.getExchangeCode();
string += '-';
string += this.getLineNumber();
return string;
};
PhoneNumberFormatter.prototype.getAreaCode = function() {
return this.slice(0, 3);
};
PhoneNumberFormatter.prototype.getExchangeCode = function() {
return this.slice(3, 6);
};
PhoneNumberFormatter.prototype.getLineNumber = function() {
return this.slice(6)
};
PhoneNumberFormatter.prototype.parenthesize = function(string) {
return '(' + string + ')';
};
// why do I need the following method?
PhoneNumberFormatter.prototype.slice = function(start, end) {
return this.numbers.slice(start, end).join('');
};
var phoneNumberOne = new PhoneNumberFormatter([6, 5, 0, 8, 3, 5, 9, 1, 7, 2]);
phoneNumberOne.render()
答案 0 :(得分:1)
我想这是为了使代码更清晰并防止代码重复而创建的。
由于在两个不同的地方使用 slice 关键字似乎让您感到困惑,我将简要解释这些差异。
在原型方法(例如getAreaCode,getExchangeCode,...)中,关键字 this 表示PhoneNumberFormatter对象。当您调用this.slice()
(在方法中)时,您正在调用此对象的 slice 方法,因此在您的代码中创建了该方法。
但是在切片方法(代码中的方法)中,您正在调用this.numbers.slice()
。在这里,您可以在数组(this.numbers
)上调用slice方法。您正在使用本机数组方法 slice 。
您可以像这样编写方法并删除代码中创建的切片方法:
PhoneNumberFormatter.prototype.getAreaCode = function() {
return this.numbers.slice(0, 3).join('');
};
答案 1 :(得分:0)
我认为您似乎遇到的主要困惑是方法slice
的名称。这会让你相信它是数组方法,但事实上并非如此。
代码中提到的slice
方法是slice
的{{1}}方法,而不是数组中的方法。
因此,解释器永远无法在原型链中找到PhoneNumberFormatter
方法,因为slice
的原型将是PhoneNumberFormatter
,而只是调用切片而不是抛出一个该方法未定义的错误。
object
方法引用this.slice
,此方法将引用它自己的PhoneNumberFormatter.prototype.slice
属性,然后调用numbers
方法slice
1}}数组。
也许更容易重命名代码,如:
numbers

这可能会让您更清楚,function PhoneNumberFormatter( numberArr ) {
this.numbers = numberArr.slice(); // copy numbers
}
PhoneNumberFormatter.prototype.getAreaCode = function() {
return this.take(0, 3);
};
PhoneNumberFormatter.prototype.take = function() {
return Array.prototype.splice.apply( this.numbers, arguments ).join('');
};
var formatter = new PhoneNumberFormatter([0,1,2,3,4,5,6,7,8,9]);
console.log(formatter.getAreaCode());
方法只是一种简化代码的实用方法,说实话,为什么要重复使用take
和slice
的5种不同方法join
部分,然后冒5次复制错误的潜在风险,或者如果您需要更改某些内容,需要进行5次相同的更改