1.OOP 指什么界阁?有哪些特性
- OOP:Object-oriented programming棺棵,縮寫OOP身弊,即面向?qū)ο蟪绦蛟O(shè)計(jì),其中兩個(gè)最重要的概念就是類和對(duì)象典格。類只是具備了某些功能和屬性的抽象模型岛宦,而實(shí)際應(yīng)用中需要一個(gè)一個(gè)實(shí)體,也就是需要對(duì)類進(jìn)行實(shí)例化耍缴,類在實(shí)例化之后就是對(duì)象砾肺。
對(duì)象:將類實(shí)例化
實(shí)例化:就是將類實(shí)現(xiàn)的過程
目的:
1.改善可讀性
2.提高重用性原則:開放封閉原則
1.開放:對(duì)模塊進(jìn)行擴(kuò)展
2.封閉:不必改動(dòng)模塊的源代碼
- 特性:三要素繼承齐佳,封裝,多態(tài)
1.繼承性:子類自動(dòng)繼承其父級(jí)類中的屬性和方法债沮,并可以添加新的屬性和方法或者對(duì)部分屬性和方法進(jìn)行重寫炼吴。繼承增加了代碼的可重用性。
2.多態(tài)性:子類繼承了來自父級(jí)類中的屬性和方法疫衩,并對(duì)其中部分方法進(jìn)行重寫硅蹦。
3.封裝性:將一個(gè)類的使用和實(shí)現(xiàn)分開,只保留部分接口和方法與外部聯(lián)系闷煤。
2.如何通過構(gòu)造函數(shù)的方式創(chuàng)建一個(gè)擁有屬性和方法的對(duì)象童芹?
var Animal = function(){
this.name = '動(dòng)物'
}//構(gòu)造函數(shù)
Animal.prototype.say =function(){
console.log(this.name+'叫')
}
var animal = new Animal()//實(shí)例化,得到一個(gè)對(duì)象
animal.say()
3. prototype 是什么鲤拿?有什么特性
function定義的對(duì)象有一個(gè)prototype屬性假褪,prototype屬性又指向了一個(gè)prototype對(duì)象,注意prototype屬性與prototype對(duì)象是兩個(gè)不同的東西近顷,要注意區(qū)別生音。在prototype對(duì)象中又有一個(gè)constructor屬性,這個(gè)constructor屬性同樣指向一個(gè)constructor對(duì)象窒升,而這個(gè)constructor對(duì)象恰恰就是這個(gè)function函數(shù)本身缀遍。
這個(gè)prototype到底有什么作用呢?看下面的例子:
function obj1(){}
obj1.prototype.name = "zyn";
var test = new obj1();
console.log(test.name)// zyn
奇怪吧饱须,明明沒有為test設(shè)置name屬性域醇,可是為什么會(huì)有值?
這就是prototype的功勞了蓉媳,prototype屬性中的name對(duì)象譬挚,在new構(gòu)造函數(shù)之后,被繼承到了對(duì)象test的屬性中酪呻。接著看:
var name = "js";
function obj2(name){
console.log(this.name);//css
}
obj2.prototype.name = "css";
var test = new obj2();
console.log(test.name)//css
第一步是建立一個(gè)新對(duì)象(test)减宣。
第二步將該對(duì)象(test)內(nèi)置的原型對(duì)象設(shè)置為構(gòu)造函數(shù)prototype 屬性引用的那個(gè)原型對(duì)象。
第三步就是將該對(duì)象(test)作為this 參數(shù)調(diào)用構(gòu)造函數(shù)号杠,完成成員設(shè)置等初始化工作蚪腋。
其中第二步中出現(xiàn)了一個(gè)新名詞就是內(nèi)置的原型對(duì)象,注意這個(gè)新名詞跟prototype對(duì)象不是一回事姨蟋, 為了區(qū)別我叫它inobj,inobj就指向了函數(shù)的prototype對(duì)象屉凯。在prototype對(duì)象中出現(xiàn)的任何屬性或者函數(shù)都可以在test對(duì)象中直接使用,這個(gè)就是JS中的原型繼承了眼溶。
通常悠砚,這樣創(chuàng)建一個(gè)對(duì)象:
function person(name){
this.name = name
this.sayHi = function(){
console.log('Hi' +' '+ this.name)
}
}
var z= new person('zyn')
z.sayHi()//Hi zyn
以上式镐,使用new關(guān)鍵字癌刽,通過對(duì)象(函數(shù)也是特殊對(duì)象)創(chuàng)建一個(gè)對(duì)象實(shí)例构韵。
在基于類的語言中悴晰,屬性或字段通常都是在類中事先定義好了,但在Javascript中枢泰,在創(chuàng)建對(duì)象之后還可以為類添加字段描融。
var Animal =function(){}
var cat = new Animal();
cat.color = "green";
以上,color這個(gè)字段只屬于當(dāng)前的cat實(shí)例衡蚂。
對(duì)于后加的字段窿克,如果想讓animal的所有實(shí)例都擁有呢?
使用prototype
var Animal =function(){}
Animal.prototype.color= "green";
var cat = new Animal();
var dog = new Animal();
console.log(cat.color);//green
console.log(dog.color);//green
通過Prototype不僅可以添加字段毛甲,還可以添加方法年叮。
var Animal =function(){}
Animal.prototype.color= "green";
var cat = new Animal();
var dog = new Animal();
console.log(cat.color);//green
console.log(dog.color);//green
Animal.prototype.run= function(){
console.log("run")
}
dog.run();
原來通過prototype屬性,在創(chuàng)建對(duì)象之后還可以改變對(duì)象的行為玻募。
比如只损,可以為數(shù)組這個(gè)特殊對(duì)象添加一個(gè)方法。
Array.prototype.remove = function(elem){//elem=2
var index = this.indexOf(elem);//index=1
if(index >= 0){
this.splice(index, 1);
}
}
var arr = [1, 2, 3] ;
arr.remove(2);
//原數(shù)組變?yōu)閍rr[1,3]
除了通過prototype為對(duì)象定義屬性或方法七咧,還可以通過對(duì)象的構(gòu)造函數(shù)來定義類的屬性或方法跃惫。
var Animal = function(){
this.color = "green";
this.run = function(){
console.log("run");
}
}
var mouse = new Animal();
mouse.run();
以上做法的也可以讓所有的Animal實(shí)例共享所有的字段和方法。并且還有一個(gè)好處是可以在構(gòu)造函數(shù)中使用類的局部變量坑雅。
var Animal = function (){
var runAlready = false;
this.color = "green";
this.run = function(){
if(!runAlreadh){
console.log("start running");
} else {
console.log("already running")
}
}
}
其實(shí)辈挂,一個(gè)更加實(shí)際的做法是把通過構(gòu)造函數(shù)結(jié)合通過prototype定義一個(gè)類的字段和行為。
ar Animal = function (){
var runAlready = false;
this.color = "green";
this.run = function(){
if(!runAlready){
console.log("start running");
} else {
console.log("already running")
}
}
}
Animal.prototype.color = '';
Animal.prototype.hide = function(){
console.log("111");
}
var horse = new Animal();
horse.run(); //start running
horse.hide();//111
Prototype允許我們?cè)趧?chuàng)建對(duì)象之后來改變對(duì)象或類的行為裹粤,并且這些通過prototype屬性添加的字段或方法所有對(duì)象實(shí)例是共享的。
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('zyn');
var p2 = new People('JL');
5. 創(chuàng)建一個(gè) Car 對(duì)象蜂林,擁有屬性name遥诉、color、status噪叙;擁有方法run矮锈,stop,getStatus
var Car = function(name,color,status){
this.name =name;
this.color =color;
this.status = status;
}
Car.prototype.run =function(){
console.log('running')
}
Car.prototype.stop =function(){
console.log('stop')
}
Car.prototype.getStatus =function(){
console.log(this.status)
}
var Ben = new Car ('Ben','black',120)
6.創(chuàng)建一個(gè) GoTop 對(duì)象睁蕾,當(dāng) new 一個(gè) GotTop 對(duì)象則會(huì)在頁面上創(chuàng)建一個(gè)回到頂部的元素苞笨,點(diǎn)擊頁面滾動(dòng)到頂部。
//主要代碼
var GoTop = function(ct,target){
this.ct = ct;
this.target = $('<div class="goTop">回到頂部</div>')
this.target.css({
position:'fixed',
right:'100px',
bottom:'50px',
display:'none',
padding:'8px',
cursor:'pointer',
border:'1px solid',
borderRadius:'4px'
})
}
GoTop.prototype.creatNode = function(){
this.ct.append(this.target);
}
GoTop.prototype.bindEvent = function(){
var _this = this;
var $window = $(window);
$window.on('scroll',function(){
var $top = $window.scrollTop()
if($top>100){
_this.target.css('display','block')
}else{
_this.target.css('display','none')
}
})
this.target.on('click',function(){
_this.ct.animate({
scrollTop : 0
})
})
}
var Gotop =new GoTop($('body'))
Gotop.creatNode();
Gotop.bindEvent();
效果
希望對(duì)給位朋友有所幫助~~
版權(quán)歸饑人谷--楠柒所有如有轉(zhuǎn)發(fā)請(qǐng)注明出處 謝謝~~