﻿

open pdf and draw c# : Add url to pdf control software platform web page windows .net web browser %5BO%60Reilly%5D%20-%20JavaScript.%20The%20Definitive%20Guide,%206th%20ed.%20-%20%5BFlanagan%5D21-part1550

else return a.reduce(f);           // Otherwise, no initial value.
}
: function(a, f, initial) {   // This algorithm from the ES5 specification
var i = 0, len = a.length, accumulator;
// Start with the specified initial value, or the first value in a
if (arguments.length > 2) accumulator = initial;
else { // Find the first defined index in the array
if (len == 0) throw TypeError();
while(i < len) {
if (i in a) {
accumulator = a[i++];
break;
}
else i++;
}
if (i == len) throw TypeError();
}
// Now call f for each remaining element in the array
while(i < len) {
if (i in a)
accumulator = f.call(undefined, accumulator, a[i], i, a);
i++;
}
return accumulator;
};
With these
map()
and
reduce()
functions defined, our code to compute the mean and
standard deviation now looks like this:
var data = [1,1,3,5,5];
var sum = function(x,y) { return x+y; };
var square = function(x) { return x*x; };
var mean = reduce(data, sum)/data.length;
var deviations = map(data, function(x) {return x-mean;});
var stddev = Math.sqrt(reduce(map(deviations, square), sum)/(data.length-1));
8.8.2  Higher-Order Functions
A higher-order function is a function that operates on functions, taking one or more
functions as arguments and returning a new function. Here is an example:
// This higher-order function returns a new function that passes its
// arguments to f and returns the logical negation of f's return value;
function not(f) {
return function() {                        // Return a new function
var result = f.apply(this, arguments); // that calls f
return !result;                        // and negates its result.
};
}
var even = function(x) { // A function to determine if a number is even
return x % 2 === 0;
};
8.8  Functional Programming | 193
Core JavaScript
Add url to pdf - insert, remove PDF links in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Free C# example code is offered for users to edit PDF document hyperlink (url), like inserting and deleting
Add url to pdf - VB.NET PDF url edit library: insert, remove PDF links in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Help to Insert a Hyperlink to Specified PDF Document Page
var odd = not(even);     // A new function that does the opposite
[1,1,3,5,5].every(odd);  // => true: every element of the array is odd
The
not()
function above is a higher-order function because it takes a function argu-
ment and returns a new function. As another example, consider the
mapper()
function
below. It takes a function argument and returns a new function that maps one array to
another using that function. This function uses the
map()
function defined earlier, and
it is important that you understand how the two functions are different:
// Return a function that expects an array argument and applies f to
// each element, returning the array of return values.
// Contrast this with the map() function from earlier.
function mapper(f) {
return function(a) { return map(a, f); };
}
var increment = function(x) { return x+1; };
var incrementer = mapper(increment);
incrementer([1,2,3])  // => [2,3,4]
Here is another, more general, example that takes two functions
f
and
g
and returns a
new function that computes
f(g())
:
// Return a new function that computes f(g(...)).
// The returned function h passes all of its arguments to g, and then passes
// the return value of g to f, and then returns the return value of f.
// Both f and g are invoked with the same this value as h was invoked with.
function compose(f,g) {
return function() {
// We use call for f because we're passing a single value and
// apply for g because we're passing an array of values.
return f.call(this, g.apply(this, arguments));
};
}
var square = function(x) { return x*x; };
var sum = function(x,y) { return x+y; };
var squareofsum = compose(square, sum);
squareofsum(2,3)                         // => 25
The
partial()
and
memoize()
functions defined in the sections that follow are two more
important higher-order functions.
8.8.3  Partial Application of Functions
The
bind()
method of a function
f
(§8.7.4) returns a new function that invokes
f
in a
specified context and with a specified set of arguments. We say that it binds the function
to an object and partially applies the arguments. The
bind()
method partially applies
arguments on the left—that is, the arguments you pass to
bind()
are placed at the start
of the argument list that is passed to the original function. But it is also possible to
partially apply arguments on the right:
194 | Chapter 8: Functions
C#: How to Open a File from a URL (HTTP, FTP) in HTML5 Viewer
License and Price. File Formats. PDF. Word. Excel. PowerPoint. Tiff. DNN (Dotnetnuke). Quick to Start. Add a Viewer Control on Open a File from a URL (HTTP, FTP).
C#: How to Add HTML5 Document Viewer Control to Your Web Page
// A utility function to convert an array-like object (or suffix of it)
// to a true array.  Used below to convert arguments objects to real arrays.
function array(a, n) { return Array.prototype.slice.call(a, n || 0); }
// The arguments to this function are passed on the left
function partialLeft(f /*, ...*/) {
var args = arguments;  // Save the outer arguments array
return function() {    // And return this function
var a = array(args, 1);         // Start with the outer args from 1 on.
a = a.concat(array(arguments)); // Then add all the inner arguments.
return f.apply(this, a);        // Then invoke f on that argument list.
};
}
// The arguments to this function are passed on the right
function partialRight(f /*, ...*/) {
var args = arguments;  // Save the outer arguments array
return function() {    // And return this function
var a = array(arguments);    // Start with the inner arguments.
a = a.concat(array(args,1)); // Then add the outer args from 1 on.
return f.apply(this, a);     // Then invoke f on that argument list.
};
}
// The arguments to this function serve as a template.  Undefined values
// in the argument list are filled in with values from the inner set.
function partial(f /*, ... */) {
var args = arguments;  // Save the outer arguments array
return function() {
var a = array(args, 1);   // Start with an array of outer args
var i=0, j=0;
// Loop through those args, filling in undefined values from inner
for(; i < a.length; i++)
if (a[i] === undefined) a[i] = arguments[j++];
// Now append any remaining inner arguments
a = a.concat(array(arguments, j))
return f.apply(this, a);
};
}
// Here is a function with three arguments
var f = function(x,y,z) { return x * (y - z); };
// Notice how these three partial applications differ
partialLeft(f, 2)(3,4)         // => -2: Bind first argument: 2 * (3 - 4)
partialRight(f, 2)(3,4)        // =>  6: Bind last argument: 3 * (4 - 2)
partial(f, undefined, 2)(3,4)  // => -6: Bind middle argument: 3 * (2 - 4)
These partial application functions allow us to easily define interesting functions out
of functions we already have defined. Here are some examples:
var increment = partialLeft(sum, 1);
var cuberoot = partialRight(Math.pow, 1/3);
String.prototype.first = partial(String.prototype.charAt, 0);
String.prototype.last = partial(String.prototype.substr, -1, 1);
8.8  Functional Programming | 195
Core JavaScript
C# PDF Library SDK to view, edit, convert, process PDF file for C#
C# Image: How to Download Image from URL in C# Project with .NET
Add this imaging library to your C#.NET project jpeg / jpg, or bmp image from a URL to your provide powerful & profession imaging controls, PDF document, tiff
Partial application becomes even more interesting when we combine it with other
higher-order functions. Here, for example, is a way to define the
not()
function shown
above using composition and partial application:
var not = partialLeft(compose, function(x) { return !x; });
var even = function(x) { return x % 2 === 0; };
var odd = not(even);
var isNumber = not(isNaN)
We can also use composition and partial application to redo our mean and standard
deviation calculations in extreme functional style:
var data = [1,1,3,5,5];                        // Our data
var sum = function(x,y) { return x+y; };       // Two elementary functions
var product = function(x,y) { return x*y; };
var neg = partial(product, -1);                // Define some others
var square = partial(Math.pow, undefined, 2);
var sqrt = partial(Math.pow, undefined, .5);
var reciprocal = partial(Math.pow, undefined, -1);
// Now compute the mean and standard deviation. This is all function
// invocations with no operators, and it starts to look like Lisp code!
var mean = product(reduce(data, sum), reciprocal(data.length));
var stddev = sqrt(product(reduce(map(data,
compose(square,
partial(sum, neg(mean)))),
sum),
reciprocal(sum(data.length,-1))));
8.8.4  Memoization
In §8.4.1 we defined a factorial function that cached its previously computed results.
In functional programming, this kind of caching is called memoization. The code below
shows a higher-order function,
memoize()
that accepts a function as its argument and
returns a memoized version of the function:
// Return a memoized version of f.
// It only works if arguments to f all have distinct string representations.
function memoize(f) {
var cache = {};  // Value cache stored in the closure.
return function() {
// Create a string version of the arguments to use as a cache key.
var key = arguments.length + Array.prototype.join.call(arguments,",");
if (key in cache) return cache[key];
else return cache[key] = f.apply(this, arguments);
};
}
The
memoize()
function creates a new object to use as the cache and assigns this object
to a local variable, so that it is private to (in the closure of) the returned function. The
returned function converts its arguments array to a string, and uses that string as a
property name for the cache object. If a value exists in the cache, it returns it directly.
196 | Chapter 8: Functions
C# PDF insert image Library: insert images into PDF in C#.net, ASP
C#.NET PDF SDK - Add Image to PDF Page in C#.NET. How to Insert & Add Image, Picture or Logo on PDF Page Using C#.NET. Add Image to PDF Page Using C#.NET.
C# HTML5 PDF Viewer SDK to view PDF document online in C#.NET
Insert Image to PDF. Image: Remove Image from PDF Page. Cut Image in Page. Link: Edit URL. Bookmark: Edit Images. Redact Pages. Annotation & Drawing. Add Sticky Note
Otherwise, it calls the specified function to compute the value for these arguments,
caches that value, and returns it. Here is how we might use
memoize()
:
// Return the Greatest Common Divisor of two integers, using the Euclidian
// algorithm: http://en.wikipedia.org/wiki/Euclidean_algorithm
function gcd(a,b) {  // Type checking for a and b has been omitted
var t;                            // Temporary variable for swapping values
if (a < b) t=b, b=a, a=t;         // Ensure that a >= b
while(b != 0) t=b, b = a%b, a=t;  // This is Euclid's algorithm for GCD
return a;
}
var gcdmemo = memoize(gcd);
gcdmemo(85, 187)  // => 17
// Note that when we write a recursive function that we will be memoizing,
// we typically want to recurse to the memoized version, not the original.
var factorial = memoize(function(n) {
return (n <= 1) ? 1 : n * factorial(n-1);
});
factorial(5)      // => 120.  Also caches values for 4, 3, 2 and 1.
8.8  Functional Programming | 197
Core JavaScript
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
to PDF. Image: Remove Image from PDF Page. Image Link: Edit URL. Bookmark: Edit Bookmark. Metadata: Edit, Delete Redact Pages. Annotation & Drawing. Add Sticky Note
VB.NET Image: VB Code to Download and Save Image from Web URL
Apart from image downloading from web URL, RasterEdge .NET Imaging SDK still dedicated to provide powerful & profession imaging controls, PDF document, image
CHAPTER 9
Classes and Modules
JavaScript objects were covered in Chapter 6. That chapter treated each object as a
unique set of properties, different from every other object. It is often useful, however,
to define a class of objects that share certain properties. Members, or instances, of the
class have their own properties to hold or define their state, but they also have properties
(typically methods) that define their behavior. This behavior is defined by the class and
is shared by all instances. Imagine a class named Complex to represent and perform
arithmetic on complex numbers, for example. A Complex instance would have prop-
erties to hold the real and imaginary parts (state) of the complex number. And the
Complex class would define methods to perform addition and multiplication (behav-
ior) of those numbers.
In JavaScript, classes are based on JavaScript’s prototype-based inheritance mecha-
nism. If two objects inherit properties from the same prototype object, then we say that
they are instances of the same class. JavaScript prototypes and inheritance were covered
in §6.1.3 and §6.2.2, and you must be familiar with the material in those sections to
understand this chapter. This chapter covers prototypes in §9.1.
If two objects inherit from the same prototype, this typically (but not necessarily) means
that they were created and initialized by the same constructor function. Constructors
have been covered in §4.6§6.1.2, and §8.2.3, and this chapter has more in §9.2.
If you’re familiar with strongly-typed object-oriented programming languages like Java
or C++, you’ll notice that JavaScript classes are quite different from classes in those
languages. There are some syntactic similarities, and you can emulate many features
of “classical” classes in JavaScript, but it is best to understand up front that JavaScript’s
classes and prototype-based inheritance mechanism are substantially different from the
classes and class-based inheritance mechanism of Java and similar languages. §9.3
demonstrates classical classes in JavaScript.
One of the important features of JavaScript classes is that they are dynamically extend-
able. §9.4 explains how to do this. Classes can be thought of as types, and §9.5 explains
several ways to test or determine the class of an object. That section also covers a
199
programming philosophy known as “duck-typing” that de-emphasizes object type in
favor of object capability.
After covering all of these fundamentals of object-oriented programming in JavaScript,
the chapter shifts to more practical and less architectural matters. §9.6 includes two
nontrivial example classes and demonstrates a number of practical object-oriented
techniques for improving those classes. §9.7 demonstrates (with many examples) how
to extend or subclass other classes and how to define class hierarchies in JavaScript.
§9.8 covers some of the things you can do with classes using the new features of
ECMAScript 5.
Defining classes is a way of writing modular, reusable code, and the last section of this
chapter talks about JavaScript modules more generally.
9.1  Classes and Prototypes
In JavaScript, a class is a set of objects that inherit properties from the same prototype
object. The prototype object, therefore, is the central feature of a class. In Exam-
ple 6-1 we defined an
inherit()
function that returns a newly created object that in-
herits from a specified prototype object. If we define a prototype object, and then use
inherit()
to create objects that inherit from it, we have defined a JavaScript class.
Usually, the instances of a class require further initialization, and it is common to define
a function that creates and initializes the new object. Example 9-1 demonstrates this:
it defines a prototype object for a class that represents a range of values and also defines
a “factory” function that creates and initializes a new instance of the class.
Example 9-1. A simple JavaScript class
// range.js: A class representing a range of values.
// This is a factory function that returns a new range object.
function range(from, to) {
// Use the inherit() function to create an object that inherits from the
// prototype object defined below.  The prototype object is stored as
// a property of this function, and defines the shared methods (behavior)
// for all range objects.
var r = inherit(range.methods);
// Store the start and end points (state) of this new range object.
// These are noninherited properties that are unique to this object.
r.from = from;
r.to = to;
// Finally return the new object
return r;
}
// This prototype object defines methods inherited by all range objects.
range.methods = {
// Return true if x is in the range, false otherwise
200 | Chapter 9: Classes and Modules
// This method works for textual and Date ranges as well as numeric.
includes: function(x) { return this.from <= x && x <= this.to; },
// Invoke f once for each integer in the range.
// This method works only for numeric ranges.
foreach: function(f) {
for(var x = Math.ceil(this.from); x <= this.to; x++) f(x);
},
// Return a string representation of the range
toString: function() { return "(" + this.from + "..." + this.to + ")"; }
};
// Here are example uses of a range object.
var r = range(1,3);      // Create a range object
r.includes(2);           // => true: 2 is in the range
r.foreach(console.log);  // Prints 1 2 3
console.log(r);          // Prints (1...3)
There are a few things worth noting in the code of Example 9-1. This code defines a
factory function
range()
for creating new range objects. Notice that we use a property
of this
range()
function
range.methods
as a convenient place to store the prototype
object that defines the class. There is nothing special or idiomatic about putting the
prototype object here. Second, notice that the
range()
function defines
from
and
to
properties on each range object. These are the unshared, noninherited properties that
define the unique state of each individual range object. Finally, notice that the shared,
inherited methods defined in
range.methods
all use these
from
and
to
properties, and
in order to refer to them, they use the
this
keyword to refer to the object through which
they were invoked. This use of
this
is a fundamental characteristic of the methods of
any class.
9.2  Classes and Constructors
Example 9-1 demonstrates one way to define a JavaScript class. It is not the idiomatic
way to do so, however, because it did not define a constructor. A constructor is a func-
tion designed for the initialization of newly created objects. Constructors are invoked
using the
new
keyword as described in §8.2.3. Constructor invocations using
new
au-
tomatically create the new object, so the constructor itself only needs to initialize the
state of that new object. The critical feature of constructor invocations is that the
prototype
property of the constructor is used as the prototype of the new object. This
means that all objects created with the same constructor inherit from the same object
and are therefore members of the same class. Example 9-2 shows how we could alter
the range class of Example 9-1 to use a constructor function instead of a factory
function:
Example 9-2. A Range class using a constructor
// range2.js: Another class representing a range of values.
// This is a constructor function that initializes new Range objects.
// Note that it does not create or return the object. It just initializes this.
9.2  Classes and Constructors | 201
Core JavaScript
function Range(from, to) {
// Store the start and end points (state) of this new range object.
// These are noninherited properties that are unique to this object.
this.from = from;
this.to = to;
}
// All Range objects inherit from this object.
// Note that the property name must be "prototype" for this to work.
Range.prototype = {
// Return true if x is in the range, false otherwise
// This method works for textual and Date ranges as well as numeric.
includes: function(x) { return this.from <= x && x <= this.to; },
// Invoke f once for each integer in the range.
// This method works only for numeric ranges.
foreach: function(f) {
for(var x = Math.ceil(this.from); x <= this.to; x++) f(x);
},
// Return a string representation of the range
toString: function() { return "(" + this.from + "..." + this.to + ")"; }
};
// Here are example uses of a range object
var r = new Range(1,3);   // Create a range object
r.includes(2);            // => true: 2 is in the range
r.foreach(console.log);   // Prints 1 2 3
console.log(r);           // Prints (1...3)
It is worth comparing Example 9-1 and Example 9-2 fairly carefully and noting the
differences between these two techniques for defining classes. First, notice that we
renamed the
range()
factory function to
Range()
when we converted it to a constructor.
This is a very common coding convention: constructor functions define, in a sense,
classes, and classes have names that begin with capital letters. Regular functions and
methods have names that begin with lowercase letters.
Next, notice that the
Range()
constructor is invoked (at the end of the example) with
the
new
keyword while the
range()
factory function was invoked without it. Exam-
ple 9-1 uses regular function invocation (§8.2.1) to create the new object and Exam-
ple 9-2 uses constructor invocation (§8.2.3). Because the
Range()
constructor is invoked
with
new
, it does not have to call
inherit()
or take any action to create a new object.
The new object is automatically created before the constructor is called, and it is ac-
cessible as the
this
value. The
Range()
constructor merely has to initialize
this
. Con-
structors do not even have to return the newly created object. Constructor invocation
automatically creates a new object, invokes the constructor as a method of that object,
and returns the new object. The fact that constructor invocation is so different from
regular function invocation is another reason that we give constructors names that start
with capital letters. Constructors are written to be invoked as constructors, with the
new
keyword, and they usually won’t work properly if they are invoked as regular func-
tions. A naming convention that keeps constructor functions distinct from regular
functions helps programmers to know when to use
new
.
202 | Chapter 9: Classes and Modules