如何获取要修改的其他方法的构造函数值?

时间:2017-09-05 22:02:47

标签: javascript node.js

该项目的目标是重构以前的解决方案以使用实际对象。目前,当我运行Jasmine测试时,我得到了这两个错误:

TypeError:无法读取未定义

的属性'split'

TypeError:无法设置未定义的属性“title”

为什么当我尝试将其传递给其他方法时,该类无法识别标题值?在我尝试将值发送到其他方法之前,它似乎工作但现在我正在尝试将字符串值发送到titleCreator方法,它继续返回undefined。

class bookTitle {
    constructor(title) {
        this.title = this.titleCreator(title); // this sets a title value to the bookTitle object/class
    }

    titleCreator(string) {
        // Note that this isn't meant to be a fully fledged title creator, just designed to pass these specific tests
        var littleWords = ["and", "over", "the"]; // These are the words that we don't want to capitalize

        var modifiedString = this.string
        .split(' ') // Splits string into array of words, basically breaks up the sentence
        .map(function(word,index) {
            if (index == 0) {
                return capitalize(word); // capitalize the first word of the string
            } else if (littleWords.indexOf(word) == -1) {
                return capitalize(word); // capitalize any words that are not little, the -1 is returned by indexOf if it can't find the word in the array
            } else if (littleWords.indexOf(word) >= 0) {
                return word; // do not capitalize as this word is in the list of littleWords
            }
        })
        .join(' '); // Joins every element of an array into a string with a space inbetween each value. Basically you created a sentence from an array of words

        return modifiedString;

    }

    capitalize(word) {
        return word.charAt(0).toUpperCase() + word.slice(1);
        // This function just capitalizes the word given to it
    }
}

module.exports = {
    bookTitle
}

编辑:这是我的上下文的Jasmine测试用例。该计划的想法只是通过这些案件

var bookTitles = require ('./bookTitles.js');

describe('bookTitle', function() {

    var book; // this is the object that will be passed into the test cases, returns undefined here without beforeEach

    beforeEach(function() {
        book = new bookTitles.bookTitle(); // creates a new book instance before each test is run
    });

    describe('title', function() {
        it('should capitalize the first letter', function() {
            book.title = 'inferno';
            expect(book.title).toEqual('Inferno'); // works without capitalizing
        });

        it('should capitalize every word', function() {
            book.title = 'stuart little';
            expect(book.title).toEqual('Stuart Little');
        });

        describe('should capitalize every word except...', function() {
            describe('articles', function() {
                it('does not capitalize "the"', function() {
                    book.title = 'alexander the great';
                    expect(book.title).toEqual('Alexander the Great');
                });

                it('does not capitalize "a"', function() {
                    book.title = 'to kill a mockingbird';
                    expect(book.title).toEqual('To Kill a Mockingbird');
                });

                it('does not capitalize "an"', function() {
                    book.title = 'to eat an apple a day';
                    expect(book.title).toEqual('To Eat an Apple a Day');
                });
            });

            it('conjunctions', function() {
                book.title = 'war and peace';
                expect(book.title).toEqual('War and Peace');
            });

            it('prepositions', function() {
                book.title = 'love in the time of cholera';
                expect(book.title).toEqual('Love in the Time of Cholera');
            });
        });

        describe('should always capitalize...', function() {
            it('I', function() {
                book.title = 'what i wish i knew when i was 20';
                expect(book.title).toEqual('What I Wish I Knew When I Was 20');
            });

            it('the first word', function() {
                book.title = 'the man in the iron mask';
                expect(book.title).toEqual('The Man in the Iron Mask');
            });
        });
    });
});

1 个答案:

答案 0 :(得分:0)

您正尝试在以下代码行中访问var modifiedString = this.string

this.string
在将string设置为具有任何值之前

。也许你只想使用titleCreator,传递给this.string的参数。 stringthis.string不同。由于从未分配过undefined,因此它是string,因此任何访问该方法的尝试都将失败。

要确切知道您的意图是什么有点难,但也许您打算使用this.string代替titleCreator(string) { // Note that this isn't meant to be a fully fledged title creator, just designed to pass these specific tests var littleWords = ["and", "over", "the"]; // These are the words that we don't want to capitalize var modifiedString = string .split(' ') // Splits string into array of words, basically breaks up the sentence .map(function(word,index) { if (index == 0) { return capitalize(word); // capitalize the first word of the string } else if (littleWords.indexOf(word) == -1) { return capitalize(word); // capitalize any words that are not little, the -1 is returned by indexOf if it can't find the word in the array } else if (littleWords.indexOf(word) >= 0) { return word; // do not capitalize as this word is in the list of littleWords } }) .join(' '); // Joins every element of an array into a string with a space inbetween each value. Basically you created a sentence from an array of words return modifiedString; }

bookTitle

根据您的错误说明,听起来您可能对调用let bk = new (yourModule.bookTitle)("some string") 的方式有疑问(应将其称为构造函数,如

    class bookTitle {
        constructor(title) {
            this.title = this.titleCreator(title); // this sets a title value to the bookTitle object/class
        }
    
        titleCreator(string) {
            // Note that this isn't meant to be a fully fledged title creator, just designed to pass these specific tests
            var littleWords = ["and", "over", "the"]; // These are the words that we don't want to capitalize
            
            var self = this;
    
            var modifiedString = string
            .split(' ') // Splits string into array of words, basically breaks up the sentence
            .map(function(word,index) {
                if (index == 0) {
                    return self.capitalize(word); // capitalize the first word of the string
                } else if (littleWords.indexOf(word) == -1) {
                    return self.capitalize(word); // capitalize any words that are not little, the -1 is returned by indexOf if it can't find the word in the array
                } else if (littleWords.indexOf(word) >= 0) {
                    return word; // do not capitalize as this word is in the list of littleWords
                }
            })
            .join(' '); // Joins every element of an array into a string with a space inbetween each value. Basically you created a sentence from an array of words
    
            return modifiedString;
    
        }
    
        capitalize(word) {
            return word.charAt(0).toUpperCase() + word.slice(1);
            // This function just capitalizes the word given to it
        }
    }
    
    let bookTitles = {
        bookTitle: bookTitle
    };
    
    let book = new bookTitles.bookTitle("some title of the book");
    console.log(book)

如果您需要帮助,请显示调用该构造函数的调用代码,以便我们也可以提供建议。

这是一段代码,我必须解决其他几件事:



this.string.split(...)




我必须解决的问题:

  1. string.split(...)更改为self
  2. this定义为self.capitalize()
  3. 使用capitalize()代替.title正确调用方法(在两个地方)
  4. 在调用构造函数时传入一个字符串(您的代码在没有参数的情况下调用构造函数,这会在构造函数中产生错误)。您的代码需要将字符串传递给构造函数。
  5. 此外,您的代码似乎认为仅分配给titleCreator()属性将以某种方式运行.title方法并进行适当的大小写。它不会。分配给setTitle()属性只是设置该属性。它不会运行任何方法。您可以定义一个setter方法,使其在分配给属性时运行代码,但是创建一个.titleCreator()方法可能更有意义,该方法可以执行您想要的操作(调用.title并分配结果为{{1}})。