进入正题,继承是面向对象编程中很重要的一个工具,但是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的原型中产生重复的属性。
总结:用原型链继承共享的属性和方法,而通过构造函数继承实例属性。
]]>resources :photos
代表这是一个典型的REST资 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中甚至可以直接使用对象
“
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视情况代表不同的对象,类方法中代表类本身,实例方法中代 表该类实例本身,所以在隐式发送消息时就是发送给不同的对象。
]]>在项目根目录rake -T
查看当前支持的命令,就像以前通过make来了解一个C项目的脉络,阅读
Rakefile也可以让你了解这个程序的布局,流程,组成等一些细节。
通过rake setup_github_pages[repo]
设置好与gitpages的连接之后,只需简单的
使用rake new_post[title]
和rake gen_deploy
就能将博客发布到gitpage上。
如果要先在本地审查的话,可以先用rake generate
再rake 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.git
再rake setup_github_pages[repo]
即可。
两种方式
First level
============
Second level
--------------
或者
# <h1>
## <h2>
...
###### <h6>
会显示成这样:
…
*强调*
**strong**
like this:
强调 strong
* 蜘蛛侠
* 蝙蝠侠
* 绿灯侠
1. 邪恶博士
1. 企鹅人
1. 这个不知道
这是一个[大美妞哦](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:
单行
输入`mkdir dir`
输入mkdir dir
代码快直接缩进4空格或者一个tab
如果想在一个paragraph中加入<br />
,只需在一行后面加两个
以上的空格即可。
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自带的图标,之后可能需要再设置一下运行权限。 这样桌面就有了一个美观的快捷启动方式。
]]>