問題1: OOP 指什么?有哪些特性
OOP(Object-Oriented-Programming),指面向?qū)ο蟪绦蛟O(shè)計(jì)。是一種程序設(shè)計(jì)思想。OOP把對(duì)象作為程序的基本單元,一個(gè)對(duì)象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)。
三個(gè)基本特征分別為:
- 封裝
也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏。封裝是面向?qū)ο蟮奶卣髦唬菍?duì)象和類概念的主要特性。 簡單的說,一個(gè)類就是一個(gè)封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實(shí)體。在一個(gè)對(duì)象內(nèi)部,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問。通過這種方式,對(duì)象對(duì)內(nèi)部數(shù)據(jù)提供了不同級(jí)別的保護(hù),以防止程序中無關(guān)的部分意外的改變或錯(cuò)誤的使用了對(duì)象的私有部分。
- 繼承
所謂繼承是指可以讓某個(gè)類型的對(duì)象獲得另一個(gè)類型的對(duì)象的屬性的方法。它支持按級(jí)分類的概念。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展。 通過繼承創(chuàng)建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。繼承的過程,就是從一般到特殊的過程。要實(shí)現(xiàn)繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實(shí)現(xiàn)。繼承概念的實(shí)現(xiàn)方式有二類:實(shí)現(xiàn)繼承與接口繼承。實(shí)現(xiàn)繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實(shí)現(xiàn)的能力;
- 多態(tài)
就是指一個(gè)類實(shí)例的相同方法在不同情形有不同表現(xiàn)形式。多態(tài)機(jī)制使具有不同內(nèi)部結(jié)構(gòu)的對(duì)象可以共享相同的外部接口。這意味著,雖然針對(duì)不同對(duì)象的具體操作不同,但通過一個(gè)公共的類,它們(那些操作)可以通過相同的方式予以調(diào)用。
參考資料:http://www.cnblogs.com/hnrainll/archive/2012/09/18/2690846.html
問題2: 如何通過構(gòu)造函數(shù)的方式創(chuàng)建一個(gè)擁有屬性和方法的對(duì)象?
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHi = function() {
console.log('Hello Wrold!');
};
}
var person = new Person('face', 18);
問題3: prototype 是什么?有什么特性
prototype是通過調(diào)用構(gòu)造函數(shù)而創(chuàng)建的對(duì)象實(shí)例的原型對(duì)象。
將實(shí)例需要共享的屬性和方法放在prototype對(duì)象中,實(shí)例對(duì)象將可以自動(dòng)引用:
function Person(name) {
this.name = name;
}
Person.prototype = { species: 'people' };
var personOne = new Person('one');
console.log(personOne.species); // people
var personTwo = new Person('two');
console.log(personTwo.species); // people
在上面的例子中,species屬性放到了prototype對(duì)象中,新疆的實(shí)例都可以共享;
同時(shí)只要修改了prototype對(duì)象,實(shí)例對(duì)象也會(huì)隨著修改。
問題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('hello');
var p2 = new People('world');
問題5: 創(chuàng)建一個(gè) Car 對(duì)象,擁有屬性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('It is running');
},
stop: function() {
console.log('It is stop');
},
getStatus: function() {
console.log(this.status);
}
};
var car = new Car('audi', 'white', 'well');
問題6: 創(chuàng)建一個(gè) GoTop 對(duì)象,當(dāng) new 一個(gè) GotTop 對(duì)象則會(huì)在頁面上創(chuàng)建一個(gè)回到頂部的元素,點(diǎn)擊頁面滾動(dòng)到頂部。擁有以下屬性和方法
-
ct
屬性,GoTop 對(duì)應(yīng)的 DOM 元素的容器 -
target
屬性, GoTop 對(duì)應(yīng)的 DOM 元素 -
bindEvent
方法, 用于綁定事件 -
createNode
方法, 用于在容器內(nèi)創(chuàng)建節(jié)點(diǎn)
function GoTop() {
this.ct = document.querySelector('.ct');
this.target = this.createNode();
this.bindEvent();
}
GoTop.prototype.bindEvent = function() {
var self = this;
this.target.onclick = function() {
window.scrollTo(0, 0);
};
};
GoTop.prototype.createNode = function() {
var target = document.createElement('div');
target.innerText = '點(diǎn)我回到頂部';
target.classList.add('btn');
this.ct.appendChild(target);
return target;
};
var goTop = new GoTop();
問題7: 使用木桶布局實(shí)現(xiàn)一個(gè)圖片墻
查看源碼:點(diǎn)擊查看
效果預(yù)覽:點(diǎn)擊查看
參考資料:http://www.cnblogs.com/hnrainll/archive/2012/09/18/2690846.html
參考資料:http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html