1: OOP 指什么?有哪些特性
面向?qū)ο蟪绦蛟O計(英語:Object-oriented programming,縮寫:OOP)是種具有對象概念的程序編程范型,同時也是一種程序開發(fā)的抽象方針。它可能包含數(shù)據(jù)、屬性、代碼與方法。對象則指的是類的實例。它將對象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴展性,對象里的程序可以訪問及經(jīng)常修改對象相關連的數(shù)據(jù)。在面向?qū)ο蟪绦蚓幊汤?,計算機程序會被設計成彼此相關的對象
面向?qū)ο蟪绦蛟O計可以看作一種在程序中包含各種獨立而又互相調(diào)用的對象的思想,這與傳統(tǒng)的思想剛好相反:傳統(tǒng)的程序設計主張將程序看作一系列函數(shù)的集合,或者直接就是一系列對電腦下達的指令。面向?qū)ο蟪绦蛟O計中的每一個對象都應該能夠接受數(shù)據(jù)、處理數(shù)據(jù)并將數(shù)據(jù)傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。
特征
支持面向?qū)ο缶幊陶Z言通常利用繼承其他類達到代碼重用和可擴展性的特性。而類有兩個主要的概念:
類(Class):定義了一件事物的抽象特點。類的定義包含了數(shù)據(jù)的形式以及對數(shù)據(jù)的操作。
對象:是類的實例。
示例(偽代碼):
//抽象的類,描述了一樣事物的特征
類 狗
開始
公有成員:
吠叫():
私有成員:
毛皮顏色:
孕育:
結束
<------------------------------------------>
//對象,該類事物的具體化
定義萊絲是狗
萊絲.毛皮顏色:棕白色
萊絲.吠叫()
封裝性:封裝是通過限制只有特定類的對象可以訪問這一特定類的成員,而它們通常利用接口實現(xiàn)消息的傳入傳出。
/* 一個面向過程的程序會這樣寫: */
定義萊絲
萊絲.設置音調(diào)(5)
萊絲.吸氣()
萊絲.吐氣()
/* 而當狗的吠叫被封裝到類中,任何人都可以簡單地使用: */
定義萊絲是狗
萊絲.吠叫()
繼承:繼承性(Inheritance)是指,在某種情況下,一個類會有“子類”。子類比原本的類(稱為父類)要更加具體化。
類牧羊犬:繼承狗
定義萊絲是牧羊犬
萊絲.吠叫() /* 注意這里調(diào)用的是狗的子類牧羊犬的吠叫方法。*/
多態(tài):多態(tài)(Polymorphism)是指由繼承而產(chǎn)生的相關的不同的類,其對象對同一消息會做出不同的響應
/*
* 狗和雞都有“叫()”這一方法
* 但是調(diào)用狗的“叫()”,狗會吠叫
* 調(diào)用雞的“叫()”,雞則會啼叫
*/
類狗
開始
公有成員:
叫()
開始
吠叫()
結束
結束
類雞
開始
公有成員:
叫()
開始
啼叫()
結束
結束
定義萊絲是狗
定義魯斯特是雞
萊絲.叫()
魯斯特.叫()
2: 如何通過構造函數(shù)的方式創(chuàng)建一個擁有屬性和方法的對象?
var F = function(properties){
this.properties = properties;
methods: function(){
//methods...
}
};
var foo = new F();
3: prototype 是什么?有什么特性
對象的原型,利用constructor和prototype解決了繼承和代碼重復調(diào)用,減少了不必要的內(nèi)存損耗,如下:
我們在使用new構造函數(shù)的過程當中
每個函數(shù)都自動添加一個名稱為prototype屬性,這是一個對象
每個對象都有一個內(nèi)部屬性 proto(規(guī)范中沒有指定這個名稱,但是瀏覽器都這么實現(xiàn)的) 指向其類型的prototype屬性,類的實例也是對象,其proto屬性指向“類”的prototype
這里,我們可以知道
所有實例都會通過原型鏈引用到類型的prototype
prototype相當于特定類型所有實例都可以訪問到的一個公共容器
重復的東西移動到公共容器里放一份就可以了
示例:
function Person(nick, age){
this.nick = nick;
this.age = age;
}
Person.prototype.sayName = function(){
console.log(this.nick);
}
var p1 = new Person();
p1.sayName();

4:畫出如下代碼的原型圖
function People (name){
this.name = name;
this.sayName = function(){
console.log('my name is:' + this.name);
}
}
People.prototype.walk = function(){
console.log(this.name + ' is walking');
}
var p1 = new People('饑人谷');
var p2 = new People('前端');

5: 創(chuàng)建一個 Car 對象,擁有屬性name、color、status;擁有方法run,stop,getStatus
function Car (name, color, status){
this.name = name;
this.color = color;
this.status = status;
}
Car.prototype.run = function(){
console.log(this.name + 'is running')
}
Car.prototype.stop = function(){
console.log(this.name + 'stoped')
}
Car.prototype.getStatus = function(){
console.log('status:' + this.status)
}
var car = new Car('fff', 'black', '0')
car.run()
car.stop()
car.getStatus()
6: 創(chuàng)建一個 GoTop 對象,當 new 一個 GotTop 對象則會在頁面上創(chuàng)建一個回到頂部的元素,點擊頁面滾動到頂部。擁有以下屬性和方法

核心代碼:
var GotTop = function($container, $element) {
this.ct = $container;
this.element = $element;
}
GotTop.prototype.bindEvent = function(){
var _this = this
$(window).scroll(function(){
var scrollTop = _this.ct.scrollTop()
if(scrollTop > 100){
_this.element.show('slow')
}else{
_this.element.hide('slow')
}
})
_this.element.on('click', function(){
_this.ct.animate({
scrollTop: 0
}, 600)
})
}
GotTop.prototype.createNode = function(){
this.ct.append(this.element)
}
var goTop = new GotTop($('body'), $('<div class="go-top">頂部</div>'))
goTop.bindEvent()
goTop.createNode()