Chrome For Mac 离线安装包下载

以前写过一篇Chrome离线安装包下载方法是用于Windows的,今天重装了Mac,由于最新的版本不稳定,所以还是下载老版本。网上其它站点下载的不可信,得从Google官方的站点下才行,终于,偶还真把 Google Chrome 18.0.1025.168这个版本给下载下来了。
实际下载地址:

http://dl.google.com/chrome/mac/GoogleChrome-18.0.1025.168.dmg

Chrome Releases Blog查到对应的版本号,替换即可。
-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笔记(七)

第五章 原型

原型链继承:new 出来的对象仍能继承到给原型prototype添加的方法

给实例添加与原型属性同名的属性,会隐藏原型链属性。
>>> var Class = function(){};
>>> Class.prototype.name = ‘John’;
>>> var toy = new Class()
>>> toy.name = ‘Tom’;
>>> toy.name
“Tom”
>>> delete toy.name
>>> toy.name
“John”

并不是所有的属性都会在for in中被枚举出来。
判断属性是自身属性还是原型链上的属性使用hasOwnProperty()
propertyIsEnumerable()对于prototype上的属性都会返回false,虽然他们都能在for in中被枚举出来。

isPrototypeOf()判断一个对象是否是另一个对象的原型。

Prototype陷阱
prototype对象被替换后,实例的原型链仍然是存在的
prototype.constructor并不可靠
介于此,重写prototype后,最好重置constructor (这里的确很让人迷惑)
-EOF-

新项目: Story Board

大约在前年,我就开始使用Python写Blog程序并将其Hosted在GAE上,并一度有将其开源的打算,后由于GAE数据库读取价格策略改变,代价太高而放弃;期间还写了一个简单的图片存储程序承诺将其开源,由于代码过于草稿没时间整理也一拖再拖。两者,代码至今都没有释放出来。

而在今年年初,GAE完美支持Django+MySQL,给原本失去的希望又重新点燃,用其托管一个小访问量的站点又有了规避方案,另一方面Cloud SQL可以方便的导出数据,数据备份不需要再经过复杂的操作。在二月结束的时候,我写了一个小的网站原型,后经过改进,并将其命名为Story Board托管在GitHub上开源出来。

同时用它替换原来的Oh Bug!。希望Oh Bug!不再单单只是一个Blog,也是一个小众技术讨论区,欢迎任何人参与进来讨论~

Project Story Board
https://github.com/darcyliu/storyboard

Oh Bug!
http://www.ohbug.com/

You are very welcome.

-EOF-

实现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-