蛇道

JavaScript的继承

JavaScript过去曾是一门受到轻视的玩具语言,但随着互联网的发展,浏览器的进步,JavaScript也在逐渐改进,迎来了自己的时代。现在,我们即将告别桌面时代而跨入浏览器时代,什么事情都可以通过浏览器完成,一大堆的Web应用可以满足各种需求,JavaScript作为浏览器的标准语言,我们不该在对它抱有偏见。

进入正题,继承是面向对象编程中很重要的一个工具,但是JavaScript不像其他语言那样显式的支持继承,而是使用一种叫做原型的东西来支持继承。

function Person(name){
  this.name = name;
}
var person1 = new Person("liMing");

如上所示,这是一个最基本的构造函数,JavaScript中的函数用new执行时,会返回一个新的对象,函数体中的this就指代这个即将产生的新对象。现在我们可以通过Person来产生很多代表人的对象,但我还想加一个属性species物种,表示人只不过是个动物而已,所以不要把人想的太高级。这个属性所有的人都是一样的,如果放在Person里this.species="animal" 每生成一个对象就赋值一次的话就产生了重复。所以JavaScript就用一种东西来存放一类对象共有的属性或者方法Person.prototype.species="animal" 实际上,每一个函数创建时都会产生一个指针prototype指向一个叫做原型对象的东西,而当构造函数产生新实例的时,新实例也有一个指针[[prototype]]指向这个原型对象。执行person1.species时,会先在实例本身上查找有没有species属性,如果有,则返回之,如果没有,就通过[[prototype]]找到原型对象,在它上查找有没有需要的属性,如果还没有,继续通过原型指针往下一个对象查找。这就是原型链。实际上,JavaScript所有对象都是Object的实例,所以最后都会查找到Object.prototype,有很多有用的函数都是定义在这里的。通过上面的查找顺序可知,当在实例上找到属性时就不会再向上原型中查找,所以实例中的同名属性会屏蔽原型链中的属性。

function Person(name,friends){
  this.name = name;
  this.friends = friends;
 }
 Person.prototype = {constructor:Person,  //constructor在这里不重要,请自行搜索
                  species:"animal",
                  characteristic:["selfish"]};

这样我们就有了一个不错的抽象,实例各自不同的属性在构造函数中,共有的属性或方法在它的原型对象中。接下来我们实现继承,创建一个Chinese类,最直接的想法就是

function Chinese(name,friends){
Person.apply(this,arguments);//调用父类的构造函数,apply第一个参数是上下文,第二个是参数
this.nationality = "china";

}

Chinese.prototype = Person.prototype;

让我们试一试var c = new Chinese("baoQiang",["xuZheng"]);,貌似不错的完成了继承,既有国籍属性,也有自私等等。。。但是这种方法有一个问题:子类的原型对象直接指向父类的原型对象,如果我们给子类在prototype上加一点方法比如中国特色社会主义,那么父类的实例也能访问到了,这明显是不对的,万恶的美帝怎么可能理解中国特色社会主义呢,所以我们要加以改进。将最后一行改成: Chinese.prototype = new Person(); 因为这里Chinese的原型指向了一个新的对象,所以修改它不会影响到父类的原型。而且name,friends属性也成为了原型中的属性,由于我们在构造函数中又重复生成了实例属性name,friends,所以屏蔽了原型中的,不会影响使用。这种继承方法是现在最流行的实现。但是也存在问题,调用了2次父类的构造函数导致在子类实例和原型中有重复的属性,虽然不影响使用,但是不优雅。有洁癖的人们就想出了另一种方法。

function clone(o){
  function F(){}
  F.prototype = o;
  return new F();
}
Chinese.prototype = clone(Person.prototype);

首先,在clone函数中,使用了一个临时的构造函数F加入了一层隔离开了,使子类原型不会影响到父类原型。其次,这个F的实例只有父类Person的原型属性,没有实例私有属性,所以是一个洁净的实例对象,则不会在子类Chinese的原型中产生重复的属性。

总结:用原型链继承共享的属性和方法,而通过构造函数继承实例属性。

Comments

Rails Routes

今天研究了一下Rails中的路由,刚接触Rails的时候,路由是一个大难题,
包括它那充满magic的helper方法。 Rails实践了RESTful的路由方式,将HTTP的动作映射为web资源的七种典型
操作。 在config/routes.rb中加上resources :photos代表这是一个典型的REST资
源。Rails自动产生相关的路由。 自动产生的Routes

index,new,create,show,edit,update,destroy是控制器中典型的七个action
,HTTP动作和url路径的组合确定了由哪一个控制器及action处理请求。 并且会产生相应的helper。

photos_path          #/photos
new_photo_path       #/photos/new
edit_photo_path(:id) #/photos/:id/edit
photo_path(:id)          #/photos/:id

参数也可以是相应的对象本身,在link_to等helper中甚至可以直接使用对象

Comments

Ruby的变量与方法

calss foo
    def some_behavior_on(string)
        string.upcase #向另一个对象发送消息
    end

    def some_behavior
        another_behavior #隐式向自己发送消息,调用的额也是实例方法another_behavior
    end

    def another_behavior
    end

    def self_behavior
        self.another_behavior #显式向self自己发送消息,调用的是实例方法another_behavior
    end

    def self.bar
        fun #消息发送给类对象本身,即调用self.fun
    end

    def self.fun
    end
end

类方法和实例方法

以self.开头的是类方法,该方法属于这个类本身,接受这个方法消息的是类对象。 其他的方法属于实例方法,属于该类的实例,接受消息的是该类实例。 而在方法体中的self视情况代表不同的对象,类方法中代表类本身,实例方法中代 表该类实例本身,所以在隐式发送消息时就是发送给不同的对象。

Comments

Octopress体会

Octopress是一个基于Jekyll的静态站点生成程序,集成了一些插件,内建了几种站点的部署 用gitpages尤其方便。

在项目根目录rake -T查看当前支持的命令,就像以前通过make来了解一个C项目的脉络,阅读 Rakefile也可以让你了解这个程序的布局,流程,组成等一些细节。

通过rake setup_github_pages[repo]设置好与gitpages的连接之后,只需简单的 使用rake new_post[title]rake gen_deploy就能将博客发布到gitpage上。 如果要先在本地审查的话,可以先用rake generaterake preview会在本地的4000端口开一个服务器,当检查完毕 确认之后再rake deploy上传即可

项目默认在根目录下是source分支,同步到git的source分支,在_deploy下是master分支, 将生成的静态站点上传到远程项目的master分支用于显示。

sass和source/_includes/下的custom目录都是用来自定义的。当rake install[theme]新主题 时,使用rake update_source[theme]rake update_style[theme]会拷贝回这些自定义的内容直接应用到新主题。

项目所支持的rake command都是管理master分支的,source分支需要自己手动push。

如果要在另一台机器上写博客,可以先git clone -b source git@github.com:name/name.github.com.gitrake setup_github_pages[repo]即可。

Comments

熟悉MarkDown

Markdown是一种用来简化HTML撰写的语法,使用它能够快速的实现常用的HTML元素。
octopress默认使用这种格式。

标题

两种方式

First level
============
Second level
--------------

或者

# <h1>
## <h2>
...
###### <h6>

会显示成这样:

First level

Second level

h1

h2

h6
*强调*
**strong**

like this:

强调 strong

列表

* 蜘蛛侠
* 蝙蝠侠
* 绿灯侠
1. 邪恶博士
1. 企鹅人
1. 这个不知道
  • 蜘蛛侠
  • 蝙蝠侠
  • 绿灯侠

  1. 邪恶博士
  2. 企鹅人
  3. 这个不知道

链接

这是一个[大美妞哦](http://meinv.com)

or

我用了这个[东东][1]一次,[东东][1]两次,[东东][1]三次。。。
[1]: http://dongdong.com

这是一个大美妞哦

or

我用了这个东东一次,东东两次,东东三次。。。

图片

![Markdown](http://www.youapp.cn/data/attachment/forum/201204/01/112904r6kk06zepluql7k6.jpg)

like this:

Markdown

代码

单行

输入`mkdir dir`

输入mkdir dir

代码快直接缩进4空格或者一个tab

注意

如果想在一个paragraph中加入<br />,只需在一行后面加两个
以上的空格即可。

Comments

Ubuntu建立桌面快捷方式

今天下载了sublime text2这个编辑器,想在桌面放一个快捷方式方便启动。一开始 用了

ln -s /opt/Sublime/sunlime_text ~/桌面/sublime_text #注意要用绝对路径,路径中的空格要转义

建立了一个软链接放在桌面,满足了需求但是很图标很丑陋。

于是换用第二种方法,使用启动器。在桌面建立一个文件名为sublime.desktop,编辑内容为:

[Desktop Entry]
Version=1.0
Type=Application
Name=sublime
Exec=/opt/Sublime/sublime_text
Icon=/opt/Sublime/Icon/256*256/sublime_text.png

使用了sublime自带的图标,之后可能需要再设置一下运行权限。 这样桌面就有了一个美观的快捷启动方式。

Comments

开通了新博客

第一次用这种传说中hack的方式写博客,感觉不错,哈哈!

Comments