JavaScript构造函数方法

时间:2017-01-07 22:40:10

标签: javascript

我想知道为什么我需要下面的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()

2 个答案:

答案 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());方法只是一种简化代码的实用方法,说实话,为什么要重复使用takeslice的5种不同方法join部分,然后冒5次复制错误的潜在风险,或者如果您需要更改某些内容,需要进行5次相同的更改