实现JavaScript类继承(inherits)

简单实现了个JavaScript类继承(比下午在公司实现的要简单得多),继承prototype方法和静态方法,实际使用过程中mix函数还需要丰满一下。这东西水很深,自己也一知半解的,不多说直接放代码。

Function.prototype.method = function(name,fn){
	this.prototype[name] = fn;
	return this;
}
Function.method('inherits',(function(){
	function mix(a,b){
		for(var i in b){
			//replace
			if(typeof a[i] == 'undefined'){
				a[i] = b[i];
			} 
		}
	}
	return function(Parent){
		var fn = function(){};
		mix(this.prototype,Parent.prototype);
		mix(this,Parent);
		this.__super__ = Parent;
		//static method
		//object.__super__.demo

		//prototype method
		//object.__super__.prototype.hidden
	  return this;
	};
})());


var a = function(){};
var b = function(){};
var c = function(){};
var d = function(){};
a.prototype.show = function(){
	console.log('a show');
};
b.prototype.hidden = function(){
	console.log('b hidden');
};
a.test = function(){
	console.log('a test');
};
b.demo = function(){
	console.log('b demo');
};

//usage
b.inherits(a);
c.inherits(a);
d.inherits(b);

-EOF-

Object-Oriented JavaScript笔记(三)

Object-Oriented JavaScript 笔记
Object-Oriented JavaScript笔记(一)
Object-Oriented JavaScript笔记(二)
Object-Oriented JavaScript笔记(三)
Object-Oriented JavaScript笔记(四)
Object-Oriented JavaScript笔记(五)
Object-Oriented JavaScript笔记(六)
Object-Oriented JavaScript笔记(七)

第四章 对象

对象
对象属性名需要引号括起来的情况有:
1.保留字2.包含空格或特殊字符3.以数字开头
Best Practice Tip: No quotes
1.使用点访问符访问方法和属性
2.在对象字面量中不要使用引号将属性括起来

构造函数
按照约定,构造函数首字母大写

不使用new操作符调用构造函数跟调用普通函数无异,此时this指针指向全局对象global object

JavaScript 是运行在宿主环境中的,其提供一个全局对象,所有的全局变量都是全局对象的属性。
在浏览器中,该全局对象是window,如
>>> var a = 1;
>>> window.a
1

instanceof操作符用于测试对象的构造函数
注:原书103页的h instanceof Object;得到false实际上是印刷错误, Object是基类

特例:
>>> Object.prototype instanceof Object;
false
>>> Object instanceof Object;
true
说明Object.prototype可能是内置类型
函数返回对象,可以用该特性来改变this指针
function Test = function(){ this.name = ‘Tom’;
return {‘name’:’Tony’};
}

传入函数的对象是按引用传递的,将对象赋值给其他变量也如此,这意味着只是变了别名,修改引用对象也会改变原对象。

指向同一对象的变量比较时才会返回true,即使比较两个对象包含相同的方法和属性得到的也是false。

内置对象

内置对象可以分为三组:
1.数据包装类的 — Object, Array, Function, Boolean, Number, and String
2.工具类的 — Math, Date, RegExp
3.异常类的 — Error

对象构造方法:
1.使用构造函数
var o = new Object();

2.使用字面量
var o = {};

简单对象valueOf方法返回的是自身
>>> var o = {};
>>> o.valueOf() === o
true

继承自Object的对象会带上
o.constructor
o.toString()
o.valueOf()

数组对象

数组对象构造方法:
1.使用构造函数
var a = new Array();

2.使用字面量
var a = [];

数组构造函数传入单个数字的话,定义的是数组的长度;但使用字面量方式不存在该问题。
>>> var a2 = new Array(5);
>>> a2
[undefined, undefined, undefined, undefined, undefined]

>>> var a = [5];
>>> a
[5]

数组的常用方法
1.pop 取出最后一个
2.push 插入元素到尾端
3.sort 对数组元素排序
4.join 将内容转换成字符串
5.slice 切片,不改变原对象
6.splice 切片(或替换),改变原对象

函数
Function构造函数实际上使用了eval来计算传入的字符串,尽量避免使用它。
>>> var second = new Function(‘a, b, c’, ‘d’, ‘return arguments;’);
>>> second(1,2,3,4);
[1, 2, 3, 4]

Function有一个length属性,用来返回函数的参数个数。

Function还有一个caller属性,它不是ECMA标准里面的,但浏览器都实现了它。

实例会可以调用构造函数prototype中属性和方法。

Function的toString方法返回其source code.

call和apply方法可以将对象自己的方法借给其它对象使用。

arguments是个类数组;arguments.callee指向自身。

arguments.callee可以帮助匿名函数调用自身(递归调用):

(function(count){
    if (count < 5) {
        console.log(count);
        arguments.callee(++count);
    }
})(1);

Boolean对象

Boolean对象几乎没有用。在不使用new操作符的情况下,它将非布尔值转换成布尔值,这于使用!!value是等效的。
>>> Boolean('test') == !!'test'
true

Number对象

Number对象比较有趣一点,它有一些有意思的属性:
Number.MAX_VALUE
Number.MIN_VALUE
Number.POSITIVE_INFINITY
Number.NEGATIVE_INFINITY
Number.NaN

Number对象提供三个内置方法:toFixed() 小数点位数
toPrecision() 精度
toExponential() 科学计数法

Number对象的toString方法也是很有趣的,可以传入一个[2~36]之间的整数表示要转换的进制。
>>> (9).toString(2)
"1001"

String对象

原始的string和String对象是不同的
>>> var primitive = 'Hello';
>>> typeof primitive;
"string"

>>> var obj = new String('world');
>>> typeof obj;
"object"

因而
>>> Boolean("")
false
>>> Boolean(new String(""))
true

String对象带有一些有用的方法,string类型不带有这些方法和属性,但是在普通类型上调用这些方法的时候,JavaScript将其作为对象对待。

Math/Date

Math/Date/RegExp都是工具对象
Math不是构造函数,不能使用new操作符
Date有两个静态方法
Date.parse('Jan 1, 2008')
Date.UTC(2008, 0, 1)

RegExp

RegExp正则表达式采用的是Perl 5语法
RegExp的几个属性global 全局
ignoreCase 大小写敏感
multiline 多行
lastIndex 开始位置
source 正则表达式

除lastIndex外其余都是只读。

异常
几种内置异常对象,都继承自Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError

抛出异常throw new Error(‘Custom Error’);
-EOF-

Object-Oriented JavaScript笔记(二)

Object-Oriented JavaScript 笔记
Object-Oriented JavaScript笔记(一)
Object-Oriented JavaScript笔记(二)
Object-Oriented JavaScript笔记(三)
Object-Oriented JavaScript笔记(四)
Object-Oriented JavaScript笔记(五)
Object-Oriented JavaScript笔记(六)
Object-Oriented JavaScript笔记(七)

第三章 函数

JavaScript会给定义了但是没有传值的参数赋值为undefined,若是参数多于定义的,会被忽略。

没有函数都会带有一个名为arguments的类数组变量,包含所有传入的参数信息。

JavaScript内置函数(Pre-defined Functions):
parseInt()
parseFloat()
isNaN()
isFinite()
encodeURI()
decodeURI()
encodeURIComponent()
decodeURIComponent()
eval()

使用parseInt时最好每次都明确指定第二个(基数)参数,如 parseInt(‘FF’, 16)

parseFloat只接受一个参数,并能够识别指数表示法,如 parseFloat(‘123e2’)

escape() 与 unescape() 已经被弃用,不应该再被使用。

alert并不是JavaScript的一部分,并且它会阻塞浏览器线程,在富ajax应用中不应该使用它。

未使用var 声明的变量会被分配到全局作用域
>>> var f = function(){test = 2;};
>>> test
ReferenceError: test is not defined
>>> f();
>>> test
2

函数中声明的局部变量与全局变量同名会覆盖同名全局变量,即使是先使用后声明。

var a = 123;
function f() {
     console.log(a);
     var a = 1;
     console.log(a);
}
f();

匿名函数

不仅是字符串,一些常量写在代码中也是可以的

 
"test"; [1,2,3]; undefined; null; 1;

ECMAScript 5严格模式(Strict Mode)便是利用该特性

'use strict';

Lexical Scope 函数工作在定义时的作用域,而非执行作用域。它仅能访问自己的作用域和全局作用域。

>>> function f1(){var a = 1; f2();}
>>> function f2(){return a;}
>>> f1();
a is not defined

闭包Closure的常用场景
如:循环、get/set访问器、迭代器
-EOF-

[Mac OS X]Lion编译安装mod_python

期望情况是下载好mod_python后执行编译并安装就能够搞定。

$ ./configure –with-apxs=/usr/sbin/apxs
$ make
$ sudo make install

但是事实却不尽人意,在Mac OS X Lion可能会遇到下面这个错误:

connobject.c:142: error: request for member ‘next’ in something not a structure or union
apxs:Error: Command failed with rc=65536

说明connobject.c这个文件中142行有错误,我们找到并打开它

vim src/connobject.c

将142行处的

!(b == APR_BRIGADE_SENTINEL(b) ||

改为

!(b == APR_BRIGADE_SENTINEL(bb) ||

-EOF-