The principles of object oriented JavaScript Zakas instant download
The principles of object oriented JavaScript Zakas instant download
Zakas download
https://ebookgate.com/product/the-principles-of-object-oriented-
javascript-zakas/
https://ebookgate.com/product/object-oriented-javascript-create-
scalable-reusable-high-quality-javascript-applications-and-
libraries-1st-edition-stoyan-stefanov/
https://ebookgate.com/product/object-oriented-oracle-wenny-
rahayu/
https://ebookgate.com/product/management-of-the-object-oriented-
development-process-1st-edition-liping-liu/
https://ebookgate.com/product/principles-of-object-oriented-
modeling-and-simulation-with-modelica-3-3-a-cyber-physical-
approach-2nd-edition-fritzson/
PHP Object Oriented Solutions 1st Edition David Powers
https://ebookgate.com/product/php-object-oriented-solutions-1st-
edition-david-powers/
https://ebookgate.com/product/object-oriented-programming-
with-c-2-e-second-edition-sahay/
https://ebookgate.com/product/object-oriented-design-and-
patterns-2nd-edition-cay-s-horstmann/
https://ebookgate.com/product/object-oriented-programming-with-
abap-objects-1st-edition-james-wood/
https://ebookgate.com/product/object-oriented-programming-
in-c-7th-print-with-corrections-edition-lafore/
TAKE
CONTROL OF Foreword by Cody Lindley,
T H E PR
P R IN CIPL
CIP L ES OF
Best-selling Author and
JAVASCRIPT Principal Frontend Architect
O B J ECT -O R I EN T ED
T H E F I N E ST I N G E E K E N T E RTA I N M E N T ™
w w w.nostarch.com
ZA K A S
SFI-00
The Principles of
Object-Oriented JavaScript
T h e P r i n cipl es of
Object-Oriented
JavaScript
by Nicholas C. Zakas
San Francisco
THE PRINCIPLES OF OBJECT-ORIENTED JAVASCRIPT. Copyright © 2014 by Nicholas C. Zakas.
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic
or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the
prior written permission of the copyright owner and the publisher.
Printed in USA
First printing
18 17 16 15 14 1 2 3 4 5 6 7 8 9
ISBN-10: 1-59327-540-4
ISBN-13: 978-1-59327-540-2
For information on distribution, translations, or bulk sales, please contact No Starch Press, Inc. directly:
No Starch Press and the No Starch Press logo are registered trademarks of No Starch Press, Inc. Other product and
company names mentioned herein may be the trademarks of their respective owners. Rather than use a trademark
symbol with every occurrence of a trademarked name, we are using the names only in an editorial fashion and to
the benefit of the trademark owner, with no intention of infringement of the trademark.
The information in this book is distributed on an “As Is” basis, without warranty. While every precaution has been
taken in the preparation of this work, neither the author nor No Starch Press, Inc. shall have any liability to any
person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the infor-
mation contained in it.
About the Author
Nicholas C. Zakas is a software engineer at Box and is known for w riting
on and speaking about the latest in JavaScript best practices. He honed
his experience during his five years at Yahoo!, where he was principal
frontend engineer for the Yahoo! home page. He is the author of sev-
eral books, including Maintainable JavaScript (O’Reilly Media, 2012)
and Professional JavaScript for Web Developers (Wrox, 2012).
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Chapter 2: Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Chapter 5: Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Conte nt s in De ta il
Acknowledgments xv
Introduction xvii
Who This Book Is For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xviii
Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Help and Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
1
Primitive and Reference Types 1
What Are Types? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Primitive Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Identifying Primitive Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Primitive Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Reference Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Creating Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Dereferencing Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Adding or Removing Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Instantiating Built-in Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Literal Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Object and Array Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Function Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Regular Expression Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Property Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Identifying Reference Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Identifying Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Primitive Wrapper Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2
Functions 17
Declarations vs. Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Functions as Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Object Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
The this Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Changing this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3
Understanding Objects 31
Defining Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Detecting Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Removing Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Enumeration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Types of Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Property Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Common Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Data Property Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Accessor Property Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Defining Multiple Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Retrieving Property Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Preventing Object Modification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Preventing Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Sealing Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Freezing Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4
Constructors and Prototypes 49
Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
The [[Prototype]] Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Using Prototypes with Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Changing Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Built-in Object Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5
Inheritance 65
Prototype Chaining and Object.prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Methods Inherited from Object.prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Modifying Object.prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Object Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Constructor Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
x Contents in Detail
Constructor Stealing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Accessing Supertype Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
6
Object Patterns 79
Private and Privileged Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
The Module Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Private Members for Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Mixins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Scope-Safe Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Index 93
Contents in Detail xi
Fore word
xiv Foreword
Acknowledgments
xviii Introduction
other languages is a strong indicator that this book is for you. In particu-
lar, this book is aimed at three groups of readers:
This book is not for beginners who have never written JavaScript. You
will need a good understanding of how to write and execute JavaScript
code to follow along.
Overview
Chapter 1: Primitive and Reference Types introduces the two different
value types in JavaScript: primitive and reference. You’ll learn what distin-
guishes them from each other and how understanding their differences
is important to an overall understanding of JavaScript.
Chapter 2: Functions explains the ins and outs of functions in
JavaScript. First-class functions are what makes JavaScript such an inter-
esting language.
Chapter 3: Understanding Objects details the makeup of objects in
JavaScript. JavaScript objects behave differently than objects in other lan-
guages, so a deep understanding of how objects work is vital to mastering
the language.
Chapter 4: Constructors and Prototypes expands on the previous
discussion of functions by looking more specifically at constructors. All
constructors are functions, but they are used a little bit differently. This
chapter explores the differences while also talking about creating your
own custom types.
Chapter 5: Inheritance explains how inheritance is accomplished
in JavaScript. Though there are no classes in JavaScript, that doesn’t
mean inheritance isn’t possible. In this chapter, you’ll learn about proto-
typal inheritance and how it differs from class-based inheritance.
Chapter 6: Object Patterns walks through common object pat-
terns. There are many different ways to build and compose objects in
JavaScript, and this chapter introduces you to the most popular patterns
for doing so.
Introduction xix
Primitive and
1
Reference T ypes
2 Chapter 1
Primitive Types
Primitive types represent simple pieces of data that are stored as is, such
as true and 25. There are five primitive types in JavaScript:
Boolean true or false
Number Any integer or floating-point numeric value
String A character or sequence of characters delimited
by either single or double quotes (JavaScript has no
separate character type)
Null A primitive type that has only one value, null
Undefined A primitive type that has only one value, undefined
(undefined is the value assigned to a variable that is not
initialized)
The first three types (Boolean, number, and string) behave in similar
ways, while the last two (null and undefined) work a bit differently, as will
be discussed throughout this chapter. All primitive types have literal rep-
resentations of their values. Literals represent values that aren’t stored in a
variable, such as a hardcoded name or price. Here are some examples of
each type using its literal form:
// strings
var name = "Nicholas";
var selection = "a";
// numbers
var count = 25;
var cost = 1.51;
// boolean
var found = true;
// null
var object = null;
// undefined
var flag = undefined;
var ref; // assigned undefined automatically
console.log(color1); // "red"
console.log(color2); // "red"
color1 = "blue";
console.log(color1); // "blue"
console.log(color2); // "red"
In this code, color1 is changed to "blue" and color2 retains its original
value of "red".
4 Chapter 1
As you might expect, typeof returns "string" when the value is a string;
"number" when the value is a number (regardless of integer or floating-
point values); "boolean" when the value is a Boolean; and "undefined" when
the value is undefined.
The tricky part involves null.
You wouldn’t be the first developer to be confused by the result
of this line of code:
When you run typeof null, the result is "object". But why an object
when the type is null? (In fact, this has been acknowledged as an error by
TC39, the committee that designs and maintains JavaScript. You could
reason that null is an empty object pointer, making "object" a logical
return value, but that’s still confusing.)
The best way to determine if a value is null is to compare it against
null directly, like this:
Notice that this code uses the triple equals operator (===) instead of the double
equals operator. The reason is that triple equals does the comparison without
coercing the variable to another type. To understand why this is important,
consider the following:
When you use the double equals, the string "5" and the number 5
are considered equal because the double equals converts the string into a
number before it makes the comparison. The triple equals operator doesn’t
consider these values equal because they are two different types. Likewise,
when you compare undefined and null, the double equals says that they are
equivalent, while the triple equals says they are not. When you’re trying to
identify null, use triple equals so that you can correctly identify the type.
NO T E Despite the fact that they have methods, primitive values themselves are not objects.
JavaScript makes them look like objects to provide a consistent experience in the
language, as you’ll see later in this chapter.
Reference Types
Reference types represent objects in JavaScript and are the closest things
to classes that you will find in the language. Reference values are instances
of reference types and are synonymous with objects (the rest of this chap-
ter refers to reference values simply as objects). An object is an unordered
list of properties consisting of a name (always a string) and a value. When
the value of a property is a function, it is called a method. Functions them-
selves are actually reference values in JavaScript, so there’s little differ-
ence between a property that contains an array and one that contains a
function except that a function can be executed.
Of course, you must create objects before you can begin working
with them.
Creating Objects
It sometimes helps to think of JavaScript
Object
objects as nothing more than hash tables,
as shown in Figure 1-2.
There are a couple of ways to c reate, name value
or instantiate, objects. The first is to use
the new operator with a constructor. (A con- name value
structor is simply a function that uses new
to create an object—any function can be Figure 1-2: Structure of an object
6 Chapter 1
a constructor.) By convention, constructors in JavaScript begin with a
capital letter to distinguish them from nonconstructor functions. For
example, this code instantiates a generic object and stores a reference
to it in object:
Reference types do not store the object directly into the variable to
which it is assigned, so the object variable in this example doesn’t actually
contain the object instance. Instead, it holds a pointer (or reference) to
the location in memory where the object exists. This is the primary dif-
ference between objects and primitive values, as the primitive is stored
directly in the variable.
When you assign an object to a variable, you’re actually assigning a
pointer. That means if you assign one variable to another, each variable
gets a copy of the pointer, and both still reference the same object in
memory. For example:
This code first creates an object (with new) and stores a reference in
object1. Next, object2 is assigned the value of object1. There is still only
the one instance of the object that was created on the first line, but both
variables now point to that object, as illustrated in Figure 1-3.
Memory
Variable Object
object1
Object
object1
Dereferencing Objects
JavaScript is a garbage-collected language, so you don’t really need to
worry about memory allocations when you use reference types. However,
it’s best to dereference objects that you no longer need so that the garbage
collector can free up that memory. The best way to do this is to set the
object variable to null.
// do something
Here, object1 is created and used before finally being set to null.
When there are no more references to an object in memory, the gar-
bage collector can use that memory for something else. (Dereferencing
objects is especially important in very large applications that use millions
of objects.)
object1.myCustomProperty = "Awesome!";
console.log(object2.myCustomProperty); // "Awesome!"
NO T E This example demonstrates one particularly unique aspect of JavaScript: You can
modify objects whenever you want, even if you didn’t define them in the first place.
And there are ways to prevent such modifications, as you’ll learn later in this book.
8 Chapter 1
Error A runtime error (there are also several more specific
error subtypes)
Function A function
Object A generic object
RegExp A regular expression
You can instantiate each built-in reference type using new, as
shown here:
Literal Forms
Several built-in reference types have literal forms. A literal is syntax that
allows you to define a reference value without explicitly creating an object,
using the new operator and the object’s constructor. (Earlier in this chap-
ter, you saw examples of primitive literals including string literals, numeric
literals, Boolean literals, the null literal, and the undefined literal.)
var book = {
name: "The Principles of Object-Oriented JavaScript",
year: 2014
};
You can also use string literals as property names, which is use-
ful when you want a property name to have spaces or other special
characters:
var book = {
"name": "The Principles of Object-Oriented JavaScript",
"year": 2014
};
NO T E Using an object literal doesn’t actually call new Object(). Instead, the JavaScript
engine follows the same steps it does when using new Object() without actually
calling the constructor. This is true for all reference literals.
You can define an array literal in a similar way by enclosing any num-
ber of comma-separated values inside square brackets. For example:
Function Literals
You almost always define functions using their literal form. In fact, using
the Function constructor is typically discouraged given the challenges of
maintaining, reading, and debugging a string of code rather than actual
code, so you’ll rarely see it in code.
Creating functions is much easier and less error prone when you use
the literal form. For example:
function reflect(value) {
return value;
}
// is the same as
This code defines the reflect() function, which returns any value
passed to it. Even in the case of this simple function, the literal form is
easier to write and understand than the constructor form. Further, there
10 Chapter 1
is no good way to debug functions that are created in the constructor
form: These functions aren’t recognized by JavaScript debuggers and
therefore act as a black box in your application.
// is the same as
Property Access
Properties are name/value pairs that are stored on an object. Dot nota-
tion is the most common way to access properties in JavaScript (as in
many object-oriented languages), but you can also access properties on
JavaScript objects by using bracket notation with a string.
For example, you could write this code, which uses dot notation:
function reflect(value) {
return value;
}
Other reference types are trickier to identify because, for all reference
types other than functions, typeof returns "object". That’s not very help-
ful when you’re dealing with a lot of different types. To identify reference
types more easily, you can use JavaScript’s instanceof operator.
The instanceof operator takes an object and a constructor as param-
eters. When the value is an instance of the type that the constructor speci-
fies, instanceof returns true; otherwise, it returns false, as you can see here:
function reflect(value) {
return value;
}
12 Chapter 1
In this example, several values are tested using instanceof and a con-
structor. Each reference type is correctly identified by using instanceof
and the constructor that represents its true type (even though the con-
structor wasn’t used in creating the variable).
The instanceof operator can identify inherited types. That means
every object is actually an instance of Object because every reference type
inherits from Object.
To demonstrate, the following listing examines the three references
previously created with instanceof:
function reflect(value) {
return value;
}
Identifying Arrays
Although instanceof can identify arrays, there is one exception that affects
web developers: JavaScript values can be passed back and forth between
frames in the same web page. This becomes a problem only when you try
to identify the type of a reference value, because each web page has its
own global context—its own version of Object, Array, and all other built-
in types. As a result, when you pass an array from one frame to another,
instanceof doesn’t work because the array is actually an instance of Array
from a different frame.
To solve this problem, ECMAScript 5 introduced Array.isArray(),
which definitively identifies the value as an instance of Array regardless
of the value’s origin. This method should return true when it receives
a value that is a native array from any context. If your environment is
ECMAScript 5 compliant, Array.isArray() is the best way to identify arrays:
console.log(Array.isArray(items)); // true
console.log(name.last); // undefined
This code attempts to add the property last to the string name. The
code itself is just fine except that the property disappears. What happened?
When working with regular objects, you can add properties at any time
and they stay until you manually remove them. With primitive wrapper
types, properties seem to disappear because the object on which the
property was assigned is destroyed immediately afterward.
14 Chapter 1
Here’s what’s actually happening in the JavaScript engine:
if (found) {
console.log("Found"); // this executes
}
Summary
While JavaScript doesn’t have classes, it does have types. Each variable
or piece of data is associated with a specific primitive or reference type.
The five primitive types (strings, numbers, Booleans, null, and undefined)
represent simple values stored directly in the variable object for a given
context. You can use typeof to identify primitive types with the exception
of null, which must be compared directly against the special value null.
Reference types are the closest thing to classes in JavaScript, and
objects are instances of reference types. You can create new objects
using the new operator or a reference literal. You access properties and
methods primarily using dot notation, but you can also use bracket nota-
tion. Functions are objects in JavaScript, and you can identify them with
the typeof operator. You should use instanceof with a constructor to iden-
tify objects of any other reference type.
To make primitives seem more like references, JavaScript has three
primitive wrapper types: String, Number, and Boolean. JavaScript creates
these objects behind the scenes so that you can treat primitives like
regular objects, but the temporary objects are destroyed as soon as the
statement using them is complete. Although you can create your own
instances of primitive wrappers, it’s best not to do that because it can
be confusing.
16 Chapter 1
2
Functions
This code actually assigns a function value to the variable add. The
function expression is almost identical to the function declaration except
for the missing name and the semicolon at the end. Assignment expres-
sions typically end with a semicolon, just as if you were assigning any
other value.
Although these two forms are quite similar, they differ in a very impor-
tant way. Function declarations are hoisted to the top of the context (either
the function in which the declaration occurs or the global scope) when the
code is executed. That means you can actually define a function after it is
used in code without generating an error. For example:
18 Chapter 2
This code might look like it will cause an error, but it works just fine.
That’s because the JavaScript engine hoists the function declaration to
the top and actually executes the code as if it were written like this:
// error!
var result = add(5, 5);
As long as you always define functions before using them, you can use
either function declarations or function expressions.
Functions as Values
Because JavaScript has first-class functions, you can use them just as
you do any other objects. You can assign them to variables, add them
to objects, pass them to other functions as arguments, and return them
from functions. Basically, you can use a function anywhere you would
use any other reference value. This makes JavaScript functions incredibly
powerful. Consider the following example:
u function sayHi() {
console.log("Hi!");
}
Functions 19
In this code, there is a function declaration for sayHi u. A variable
named sayHi2 is then created and assigned the value of sayHi v. Both sayHi
and sayHi2 are now pointing to the same function, and that means either
can be executed, with the same result. To understand why this happens,
take a look at the same code rewritten to use the Function constructor:
v numbers.sort();
console.log(numbers); // "[1, 10, 2, 4, 5, 6, 7, 8]"
20 Chapter 2
Compare that to the second call to sort() v, which does not use a
comparison function. The order of the array is different than expected,
as 1 is followed by 10. This is because the default comparison converts all
values to strings before comparing them.
Parameters
Another unique aspect of JavaScript functions is that you can pass any
number of parameters to any function without causing an error. That’s
because function parameters are actually stored as an array-like structure
called arguments. Just like a regular JavaScript array, arguments can grow
to contain any number of values. The values are referenced via numeric
indices, and there is a length property to determine how many values are
present.
The arguments object is automatically available inside any function. This
means named parameters in a function exist mostly for convenience and
don’t actually limit the number of arguments that a function can accept.
NO T E The arguments object is not an instance of Array and therefore doesn’t have the
same methods as an array; Array.isArray(arguments) always returns false.
function reflect(value) {
return value;
}
console.log(reflect("Hi!")); // "Hi!"
console.log(reflect("Hi!", 25)); // "Hi!"
console.log(reflect.length); // 1
reflect = function() {
return arguments[0];
};
console.log(reflect("Hi!")); // "Hi!"
console.log(reflect("Hi!", 25)); // "Hi!"
console.log(reflect.length); // 0
Functions 21
This example first defines the reflect() function using a single named
parameter, but there is no error when a second parameter is passed into
the function. Also, the length property is 1 because there is a single named
parameter. The reflect() function is then redefined with no named param-
eters; it returns arguments[0], which is the first argument that is passed in.
This new version of the function works exactly the same as the previous
version, but its length is 0.
The first implementation of reflect() is much easier to understand
because it uses a named argument (as you would in other languages).
The version that uses the arguments object can be confusing because there
are no named arguments, and you must read the body of the function to
determine if arguments are used. That is why many developers prefer to
avoid using arguments unless necessary.
Sometimes, however, using arguments is actually more effective than
naming parameters. For instance, suppose you want to create a function
that accepts any number of parameters and returns their sum. You can’t
use named parameters because you don’t know how many you will need,
so in this case, using arguments is the best option.
function sum() {
var result = 0,
i = 0,
len = arguments.length;
return result;
}
console.log(sum(1, 2)); // 3
console.log(sum(3, 4, 5, 6)); // 18
console.log(sum(50)); // 50
console.log(sum()); // 0
The sum() function accepts any number of parameters and adds them
together by iterating over the values in arguments with a while loop. This is
exactly the same as if you had to add together an array of numbers. The
function even works when no parameters are passed in, because result is
initialized with a value of 0.
22 Chapter 2
Overloading
Most object-oriented languages support function overloading, which is the
ability of a single function to have multiple signatures. A function signature
is made up of the function name plus the number and type of parameters
the function expects. Thus, a single function can have one signature that
accepts a single string argument and another that accepts two numeric
arguments. The language determines which version of a function to call
based on the arguments that are passed in.
As mentioned previously, JavaScript functions can accept any number
of parameters, and the types of parameters a function takes aren’t speci-
fied at all. That means JavaScript functions don’t actually have signatures.
A lack of function signatures also means a lack of function overloading.
Look at what happens when you try to declare two functions with the
same name:
function sayMessage(message) {
console.log(message);
}
function sayMessage() {
console.log("Default message");
}
Looking at the code this way makes it clear why the previous code
didn’t work. A function object is being assigned to sayMessage twice in a
row, so it makes sense that the first function object would be lost.
Functions 23
The fact that functions don’t have signatures in JavaScript doesn’t
mean you can’t mimic function overloading. You can retrieve the number
of parameters that were passed in by using the arguments object, and you
can use that information to determine what to do. For example:
function sayMessage(message) {
if (arguments.length === 0) {
message = "Default message";
}
console.log(message);
}
NO T E In practice, checking the named parameter against undefined is more c ommon than
relying on arguments.length.
Object Methods
As mentioned in Chapter 1, you can add and remove p roperties from
objects at any time. When a property value is actually a function, the
property is considered a method. You can add a method to an object in
the same way that you would add a property. For example, in the follow-
ing code, the person variable is assigned an object literal with a name prop-
erty and a method called sayName.
var person = {
name: "Nicholas",
sayName: function() {
console.log(person.name);
}
};
Note that the syntax for a data property and a method is exactly
the same—an identifier followed by a colon and the value. In the case
of sayName, the value just happens to be a function. You can then call
the method directly from the object as in person.sayName("Nicholas").
24 Chapter 2
Another Random Scribd Document
with Unrelated Content
Lawrence cut some fowl and bacon, adding vegetables, and filled a
small tumbler with red wine, and then, stepping to the door of the
berth in which Lucy Acton was confined, he almost noiselessly
inserted the key and softly shot the latch, and resumed his seat, and
Paul, bearing the tray of food, knocked on the door, and receiving no
reply entered, and the motion of the ship upon a long, steady heave
of swell slammed the door to after him.
Mr Lawrence, with his back turned upon this cabin door, heard
Lucy's voice, but not what she said. If Paul answered her his voice
was so sunk by the awfulness of her presence, by all that she meant
being at sea, by all that she had typified to this forlorn vagrant when
on shore, that his accents were inaudible in the cabin.
After a few minutes he came out. He approached the cabin table
and stood close. His face wore a mingled look of astonishment and
fear, and he was very pale. He was as grotesque as something
fanciful in a fairy story, with his red hair, hump, long arms, rounded
legs, and whilst he stood he scratched himself as a monkey does.
His chin was enormous, and out of all proportion to his face.
"Is Miss Acton eating her dinner?"
"No, sir."
"What did she say to you?"
"Why, your honour, when I went in she looked at me and burst into
a laugh that turned my blood cold."
"She didn't know you to be the man that gave her the letter that
brought her here?"
"She didn't look as if she remembered me, your honour, and she said
nothing about it."
"What did she say?"
"Why, your honour, she says whilst I hold the tray, 'What are you?'
'I'm the ship's steward, your ledyship,' says I. 'Ay, but what else?'
says she. 'What forest was you caught in?' I didn't understand her,
sir, and didn't answer. 'Do you come from Africa?' says she, 'or have
you broke loose from a travelling wild beast show?'"
Mr Lawrence arched his eyebrows. Certainly he did not recognise the
sweet and sympathetic Lucy Acton in these questions.
"And then she says, frowning as though she'd up with a knife off the
tray and run it into me, 'What have you got there?' 'Your dinner, your
ledyship,' says I. 'Put it down upon the floor!' says she in a sort of
shriek, as if she was trying to sing. 'Don't you see I'm in tatters?
They've got me here who am a princess at home, and these are my
rags and all I've got,' says she, spreading her dress with her hands
as though she was goin' to skip. 'Beggars in rags feed on the floor:
they feed so. Anywhere's good enough for them. I've seen 'em
sitting on the edge of ditches eating. Put the food on the floor!
That's how princesses in tatters dine.' I did as I was ordered, your
honour, and came away."
"Go in presently and see if she's done, and ask if she'll have some
fruit pie or cake, and report if the tray is still on the deck."
"Yes, sir," answered Paul, who was not sailor enough to say, "Ay, ay,
sir," which should have been his speech.
Mr Lawrence was exceedingly thoughtful. What opinion he was
arriving at, whether he was beginning to think that the girl was
really mad or that she was merely acting with extravagant absurdity
in the hope of disgusting him, you could not have told by looking at
his face.
In about ten minutes after Paul had made his report, Mr Lawrence
told him to knock on Miss Acton's cabin door and enter. This time the
door swung to and fro, and Mr Lawrence, who had turned in his seat
to follow the steward's movements, saw Miss Acton upon all fours
upon the deck with her face close to the tray, as though she was
taking up the food with her mouth. A swing of the vessel hove the
door to its latch, and hid the extraordinary picture.
A minute or two later Paul came out, shutting the door after him.
"I saw her," said Mr Lawrence. "She is on her hands and knees.
What did you say?"
"I asked her if she'd have some fruit pie or cake. She didn't look up
nor answer. She's chucked most of what I took in about the cabin."
"She has made no meal, then?"
"I couldn't tell, your honour. The piece of chicken is on the bed, and
I see the piece of bacon under it. I dunno what she was doin' with
her nose a-nuzzling of the tray as though she was a-smelling of the
salt."
"Don't enter the cabin for half an hour. Then go in and clear up. And
if she speaks, make no answer, and take no notice of her, but clean
up the mess."
He left the table, and turned the key softly in Lucy's door, withdrew
it, and went on deck. The breeze that had blown the Minorca out of
Old Harbour still sang in her shrouds, but with a fresh and a
stronger song. The sea ran in lines of brine which flashed friskily.
The mountainous clouds sailed down the blue heavens with the
solemn majesty of line-of-battle ships draped in sun-empearled cloth
from truck to waterway. The bluff-bowed barque was darting foam
from her to right and left as she thrust through the streaming waters
and rolled with dignity, slowly to leeward and yet more slowly to
windward as she brought the violet shadowed cavities of her canvas
to the wind. The hens were noisy in their coops, and cocks crew.
The sound of waters broken and in motion was musical. The
shadows of the rigging slided gently to and fro over the wide
breadth of white planks. The men in the picturesque garb of the
merchant sailor of that day, some of them in striped pantaloons
flowing to the shoe, some in short-cut blue jackets, and most of
them in round hats, were distributed over several parts of the ship.
Mr Eagle walked the weather side of the quarterdeck. In reply to Mr
Lawrence's question, he said that nothing had been in sight and
nothing was in sight. This Mr Lawrence verified by a searching
sweep of his gaze round the horizon, and Mr Eagle went below into
the cabin to eat his dinner.
When he was there he bade Paul go forward and tell Mr Pledge that
dinner awaited him. This privilege was Pledge's because, though he
was the ship's boatswain and also her carpenter, he kept watch and
headed the starboard division of the crew as second mate.
He was a tall, lank man, rather knock-kneed, with a long neck, and,
which was very unusual in those days, his chin was garnished with a
quantity of straggling reddish hair. His face looked as though it had
been put together without much judgment. His nose, which was
broken, was not in line; his mouth was somewhat on one side, one
eyebrow was raised and the other depressed. His eyes were small,
of a deep, moist, soft blue. He had served in the American Navy, and
had much to tell about Yankee captains and commodores. He was
dressed in the garb of the common sailor, and it is not wonderful
that Mr Lawrence should decline to meet him at table, which, if it did
not make their footing equal, must bring them into relations the
fastidious, haughty, handsome naval officer would regard in an
uncommon degree objectionable.
He entered the cabin and took his place. Mr Eagle at the foot of the
table carved the boiled beef. When they were fairly under way with
their dinner Paul went forward, and the two men were alone in the
cabin, out of hearing of Mr Lawrence's ears through the open
skylight if they suppressed their voices, equally out of hearing of the
inmate, under lock and key, of the captain's cabin.
Though Mr Lawrence had communicated the intelligence of the girl
being on board and of his holding sealed orders from Captain Acton
in confidence to Mr Eagle, the sensations excited in this plain and
acid sailor by the extraordinary, astounding, and unexpected
revelations had filled him to bursting point with a fever and passion
for giving the news. In short, the man's mind was much too small to
retain what had been poured into it, and of course it overflowed. To
whom other than Tom Pledge could he speak? Pledge and he had
sailed in Captain Acton's employ for two or three voyages; they were
friends, and visited each other ashore where each had a little
cottage and a wife. So after a careful survey of the skylight, which
lay open just above the table, and a cautious look round, Mr Eagle
said: "Tom, did you observe me and the Capt'n walkin' up and down
this morning in conversation?"
"Ay," answered Pledge, "and I wondered what there was between ye
to keep ye so busy in talk."
Mr Eagle again looked up at the skylight, and said as softly as his
gruff voice permitted: "What d'ye think, Tom, of our sailin' under
sealed orders from Captain Acton which the Captain's to read in
latitood twenty north and longitood thirty west? The contents of
them sealed orders aren't exactly known to the Capt'n, but he told
me from what Capt'n Acton let fall, he believed that the ship was to
be carried to another port, and there handed over to a Spanish gent
as was a-waitin' to receive her, and that the whole ship's company
was to be discharged and sent 'ome at Captain Acton's expense and
the wages they had agreed for trebled. What d'ye say to that?"
Pledge, who chewed slowly as a cow the cud, watched his
companion steadfastly, his temples throbbing with the action of his
jaws, and said: "Do you believe it, John?"
"So help me God, yes, then, as I sit here," answered Mr Eagle.
"Who is to work the ship for him?" asked Pledge. "For you may
depend upon it that if the crew are to be carried away to an
unbeknown place, they'll all go below to a man, for Jack's as good
as his master when it comes to his having to do something which he
didn't agree for."
"I put it as you do, though in different words," said Mr Eagle, "and
he answered that Captain Acton's orders must be obeyed, that the
crew's refusal would be mutiny, and that if they wouldn't work the
ship to a port, where he could ship a fresh crew, he'd heave a-back
the main-topsail yard and wait for a man-o'-war to come along."
"Well, I'm jiggered!" said Mr Pledge, now looking slightly startled, for
he was an old sailor, he well understood the despotic powers of the
captain of a ship, and he readily perceived that Mr Lawrence's
threats in case of refusal by the crew were to be carried out.
"But that's not all," continued Mr Eagle, with another glance at the
skylight. "It ain't even 'arf all, and I think you'll agree with me that
the rummiest part's got to come."
"Another slice, John!" said Pledge, pushing his plate, and cutting a
big chunk from a loaf.
"Who d'ye think's aboard?"
"Who?"
"Why, Captain Acton's daughter, Miss Lucy Acton!"
"What's she a-doing' of here?" enquired Pledge, pulling away his
plate heavy with meat and fat.
"She's a-running away with Mr Lawrence!"
"Or is Mr Lawrence a-running away with her?"
"According to his yarn," said Eagle with sour solemnity, "they've
rooned away with each other."
"Where is she?" asked Pledge.
Eagle dumbly pointed to the Captain's cabin. "It's an artfully laid
plot," said he, "if the Capt'n's to be believed. She's supposed to be
locked up agin her will. By-and-by she's to go among the sailors and
swear that she's been carried off by violence. This is to make her
father believe that she never consented to run away, as she don't
want to lose the fortune as 'ud otherwise come to her."
"Wasn't there some talk a bit of a time past of him a-courting of
her?" said Pledge.
"Why, yes, now that you remind me, I recollect."
"Well, John," said Pledge, "it's not for me nor the likes of me to
interfere in such a galavantin' job as this. If the young lady's been
run away with with her own consent, it's not for me, I says, to pay
any attention to what's 'appening. People who fall in love with each
other and are objected to by their relatives will sometimes carry on
their business in a way as might make pious, respectable old
parients feel their hair standing short up on their heads. I've lived
long enough in this 'ere world to descover that no good ever comes
to a man by messing about in other people's consarns. But when it
comes to this ship being navigated to another port than the one
agreed for, why, naturally you set me a-thinking, John. I don't know
nothing about them sealed orders you refer to, but it seemed
strange to me when I heard of it, and it's strange to me still, that Mr
Lawrence should have been chosen to command this vessel when
the berth was yourn by right of sarvice. Was it because Captain
Acton couldn't be sure of your a-executing his wishes? What d'ye
think yourself, John? You've got to consider it's two naval officers
acting together; they know each other's mind, and I guess that
when Captain Acton chose Mr Lawrence to take charge of his ship he
knew that he was in the 'ands of a man who'd listen to no talk, who
was used to man-o'-war's discipline, and would act if it came to
having to shoot men down so as to gain his ends."
Mr Eagle, whose views were undoubtedly in accord with Mr Pledge's,
viewed his companion in acid silence.
Just about this time the steward Paul came down the companion
steps with the cabin key which he had received from Mr Lawrence.
He took no notice of the two men seated at the table, but stepped
to Lucy's door, knocked, paused, inserted the key, and passed in. He
emerged in less than two minutes holding the tray that was covered
literally with broken victuals, and locking the door was about to step
up the companion ladder when Mr Pledge said: "Who've you got
locked up in that there cabin?"
"You must ask the Captain that, sir, if you want to know," Paul
answered.
"You dog! D'ye know I'm second mate? Answer me, or I'll flay ye
before sundown," said Pledge, turning scarlet.
"I durs'nt," whined Paul. "I've the Captain's orders to keep my
mouth shut," and he hastened up the steps.
He was followed by Mr Eagle, who thought it about time to relieve
the Captain.
Mr Pledge had eaten his last morsel of cheese and was leaving the
table, when his attention was arrested by a knocking on Lucy's door,
accompanied by the cries of a female; but what she said he could
not hear. So Mr Pledge, taking some steps, stood close to the door.
The voice of Lucy within cried out: "Is anybody there?"
"I'm here, ma'am," answered Pledge.
"Who are you?"
"I'm Thomas Pledge, acting second mate of this 'ere ship, ma'am."
"Open this door!"
"I can't, ma'am, it's locked," and in proof of his assurance, Pledge
turned the handle and shook the door.
"I demand to be set at liberty!" cried Lucy, in the strained, wild voice
that had frightened the hunchback steward. "The villain who
commands this ship lured me into her by pretending that Captain
Acton, who is my father and the owner of the vessel, lay seriously
injured through an accident, and wished to see me. I demand to be
returned to my home! I have been stolen away by a base artifice.
The crew of this ship are the servants of my father, and they would
know his wish must be to recover me, and your duty, and Mr Eagle's,
and the men's, is to turn the ship for Old Harbour, and surrender me
up to my father. If this is not done I shall go mad. I am mad now.
The wretch who by a lie has seduced me into this vessel, has driven
me crazy."
And with that she fell to singing, from which she broke off after a
few moments to burst into a shrieking, lunatic laugh.
Thomas Pledge's mind was of a very common order. He had
gathered from Eagle that the girl was to pretend a situation of acute
distress, that when she was married her father should not hold her
responsible for her elopement. Her words might have carried weight,
and even conviction, but for the song and loud unmeaning laugh
that closed them, in which Mr Pledge saw nothing but acting, not
having experience of insanity in any shape or form. And shouting
through the door, "I'll go and report to the Captain, ma'am, that
you're locked up and want to get out," he turned, with the intention
of making for the companion ladder, when he saw Mr Lawrence
standing a few paces abaft the steps, tall, stern, frowning, his face
fierce with the strain, and indeed almost fury, of the attention with
which he had bent his ears to catch the syllables of Lucy through the
bulkhead.
Mr Pledge started like a guilty thing surprised.
"What are you doing at that cabin door, sir?" asked Mr Lawrence. "I
do not enquire what you are doing in this cabin, for, according to the
custom of this ship, and perhaps of others in your Service, you take
your meals here. But what are you doing at that door, conversing
through it with the lady inside?"
"The lady thumped and I went to see what was the matter, sir," said
Mr Pledge, awed in his old man-o'-war instincts by the over-bearing,
I may say, the overwhelming demeanour of Mr Lawrence, which was
to his words as the thunder of the explosion is to the message of the
firearm.
"Has Mr Eagle been talking to you about the subject of our
conversation this morning?" said Mr Lawrence.
Now, Tom was too sound a shipmate to betray John. He answered
doggedly, as though Mr Lawrence as well as himself must be aware
that he was trespassing on ground he had no right to tread: "We
yarned of course together. We've sailed together afore, and can
always find something to talk about, sir."
Mr Lawrence seemed to read the man's thoughts. Unscrupulous as
was this Naval gentleman, he was an extremely clever fellow.
Preserving a severe austerity of countenance, a demeanour upon
which the word discipline was writ large, he exclaimed: "It is not my
intention to ask you if Mr Eagle has broken his faith with me and
communicated to you the confidence I imparted to him this morning.
You are, sir, by virtue of your rank aboard the ship free of this cabin,
and it is therefore desirable that I should trust you. The lady in
yonder berth is Miss Lucy Acton, who consented to elope with me,
providing it should be understood by all on board that she was being
kidnapped or stolen from her home. That this should appear, it was
arranged between us that she should be locked up as though she
were a prisoner, and then in a day or two I should enlarge her, and
she would go amongst the crew and speak of my cunning and
stratagem, and her desperate lot in being torn from her father's
home. All which would in due course reach her father's ears, and
mollify his wrath at her giving me her hand in the existing state of
my fortunes, and preserve to her the fortune she must inherit as
Captain Acton's only child. Now, sir," continued Mr Lawrence in his
frowning, imperious way, "this is submitted to you in confidence, and
it is manifestly my wish that some of the crew should credit her
story that they may give the evidence we desire when they are
called upon to tell what they know!"
"Well, sir," answered Mr Pledge, pleased by the skipper's candour
and condescension, "it's not for a plain sailor man like me to put his
hand into such a tar-bucket as this. I know my bit, and I'm a-willing
for to do it, and if the hands get to hear the story of the lady it'll
come from her or from that there humpbacked steward who waits
upon her, and not from me, for I'm for minding my own affairs, and
sticking like a barnacle to a ship's bottom to the ondertakings I enter
into."
He said this with a grave nod of the head, that the significance of
the closing passage of his speech might be mastered, for it was then
running through his mind that more lay behind the presence of Lucy
Acton on board than Mr Lawrence suspected he knew: by which he
referred to the sealed orders.
Mr Lawrence made no answer, and Mr Pledge seeing that he was to
go, went on deck by the only exit, namely, the companion ladder.
Immediately after he had passed through the hatch the steward Paul
descended.
"Did you clear away the mess from Miss Acton's berth?" asked Mr
Lawrence.
"Yes, sir."
"The lady, I presume, ate nothing?"
"I couldn't see that she had, your honour."
"When you have cleared this table, go forward and tell the cook to
cut a plate of the most delicate beef and chicken sandwiches he can
contrive. Get a bottle of red wine and a glass, and be ready to carry
the refreshments to the lady when I've left her."
He approached Miss Acton's door. Lucy was seated on a locker under
a window, three of which embellished the stern of the Minorca. The
ocean as the ship lightly depressed her stern, was visible through
this window, a blue field decked with flowers of foam that rose and
sank. The large glazed space filled the cabin with light, which
trembled with the pulse of the white wake streaming fan-wise, and
with the shivering of the sunlight into splinters of diamond brilliance
by the fretful motions of the breeze-brushed waters.
Miss Lucy Acton sat with her eyes veiled by downcast lids fixed in a
stare as lifeless as the dead upon her hands, which lay clasped in
her lap. So motionless was she, you would have said she slept. Much
of the lovely bloom that always gave to her lineaments a choice
sweetness was absent, but not the less did as much of her face as
was visible express its refined and delicate beauty.
When Mr Lawrence entered she did not raise her eyes, nor whilst he
stood looking at her did she discover by any sort of movement the
least knowledge of his presence.
"Lucy!" he said, speaking the word in the wooing voice of love.
She made no sign. He repeated her name as though startled by her
immobility in which an element of tragedy might have been found in
the singular, unwinking fixity of her stare upon her hands. He
stepped to her side, and peered closely into her face and listened to
hear if she breathed. Oh yes: she breathed, she was alive. But
though he put his face so close to her's that she might have felt his
breath upon her cheek, her form did not move by so much as might
indicate the passage of a thrill, her eyes remained as steadfast in
their gaze as though they were painted.
He withdrew a step, and exclaimed: "Lucy, why will you not speak to
me? Why will you not look at me? You know that all this is done in
the holy name of love, and God who knows me knows that I would
not cause you a pang, that your beautiful eyes should not be
shadowed by a tear drawn by any action of mine if I could have
believed that loving me as I know you do, that loving you as you
know I do, you would have come to me at the summons of my
passion, and hand in hand with me as my wife, taken your chance of
all that might have followed."
The emotion of an impassioned heart, the melody of a rich and
manly voice were in his words, and no man, though he should hate
the fellow for his wrong-doing, could have doubted his sincerity
whilst listening to his speech. Add to this his superb figure, his
handsome face glowing with feeling, the hereditary dignity of his
demeanour; but these were expressions of his meaning which she
would not raise her eyes to witness.
All on a sudden and when the silence that followed had not lasted
ten seconds, she sprang to her feet with a shriek; she dashed her
hands to her face, she rushed as though pursued to the other end of
the cabin, and there crouched with her face to the bulkhead, hidden
in her hands; and thus she stood rocking herself sideways, moaning:
"Why am I not sent home? Why am I here a prisoner? What will my
father think has become of me? Home, home, home! In the hands of
a man that dare rob his employer! At the mercy of one who of all
Captain Acton's friends and acquaintances should feel the most
deeply obliged to him." She wheeled round and out of her
incommunicable attitude and language of distress, and said, looking
at him vacantly with a cold, pale smile: "Are you Mr Lawrence, the
son of Sir William Lawrence, Captain Acton's friend?"
"You know, madam, that I am," he answered, bowing with graceful
suavity, and with a light smile that was like saying, "I understand the
import of your tactics, and am willing to wait and watch you."
"I know, sir," she exclaimed with the vehement indignation and
contempt conveyed by that perfection of art which conceals art and
which is a gift of intuition beyond the reach of those not born with it,
"that Sir William Lawrence has a son, and that he was dismissed
from the Navy for a brutal, drunken outrage of which he alone, of all
the gentlemen and officers in the Service, was capable."
He coloured brightly at this, and his frown was as though a shadow
had come between him and the light that revealed his face.
"I know," she continued, still preserving her accent of scorn and
viewing him with eyes that did not seem to be her's, so did she
contrive to diminish the breadth of the beauty of the lids, so did she
manage to look passions and feelings which the memory of her
oldest friend could never have recalled as vitalising her brooding
half-hooded gaze: "I know that this man came ashore and lived
upon his father who was poor, and drank and gambled until his
name provoked nothing but a shrug, and that one day in a fit of pity,
for which doubtless he has asked God's pardon, Captain Acton, who
loves Admiral Lawrence, gave his poor creature of a son command
of a ship. This I know," she said, letting her eyes fall suddenly from
his face down upon her fingers, which she seemed to count as she
proceeded. "But I had always supposed that there was some spirit of
goodness left in Mr Walter Lawrence. I believed that though he
might gamble and drink and live in idleness upon the bounty of his
father, he with all his imperfections was a man incapable of
outraging the feelings of a young girl, incapable of betraying the
generous confidence of one who stood to him as a warm-hearted
friend. Can you be that Mr Lawrence?" she said, peering at him in
such a peculiar fashion, with such archness of contempt that a
spectator, short-sighted and at a little distance, would have
supposed she was looking at the handsome fellow through an eye-
glass. "Oh, I am going mad to suppose it—mad to think it possible!"
She flashed her hands to her forehead, sobs seemed to shake her,
she turned on her heel and went to the big stern window, and
looked out upon the sea.
He seemed to have been struck dumb by the fury of her candour.
His teeth were fastened upon his under lip, his cheek had grown
pale.
"Will you leave this cabin," she said without turning, "and acquaint
the first ship you meet with that you have a young gentlewoman on
board who desires to be set ashore in England? I do not ask you,"
she continued, with the cutting sneer that was on her lip as plain in
her voice as though her face was visible to him, "to return this ship
and her contents to their lawful owner. But if you suppose that you
are going to gain me by keeping me a prisoner in this den, if you
imagine that all the horror which my soul can feel for a wicked,
unscrupulous man is not likely to be with me in all thoughts of you
that come to me with your presence, or fill me with madness when I
am alone, then better for you if you should go to the stack of
muskets which is in the cabin, load one and shoot yourself."
And clapping her hands as though she was in the box of a theatre
ravished by some transcendently fine performance, she once more
delivered herself of the maniac laugh which had curdled Paul's blood
and which though ringing from lips, though proceeding from a face
hidden from him, seemed to strike Mr Lawrence as nothing which
she had spoken had, and save but for the swaying of the ship he
stood as motionless as a statue facing another statue whose back
was turned to him.
CHAPTER XII
MR LAWRENCE REFLECTS
ebookgate.com