好程序員web前端學(xué)習(xí)路線之Javascript面向?qū)ο?,面向?qū)ο笫鞘褂脤?duì)象,面向?qū)ο箝_發(fā)就是使用對(duì)象開發(fā)。
茂名ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
面向過程就是用過程的方式進(jìn)行開發(fā),面向?qū)ο笫菍?duì)面向過程的封裝
面向?qū)ο蟮娜筇匦裕?/p>
抽象性:
如果需要一個(gè)對(duì)象描述數(shù)據(jù),需要抽取這個(gè)對(duì)象的核心數(shù)據(jù),提出需要的核心屬性和方法,不在特定的環(huán)境下無法明確對(duì)象的具體意義。
狹義的抽象,也就是代碼里的抽象,就是把一些相關(guān)聯(lián)的業(yè)務(wù)邏輯分離成屬性和方法(行為),這些屬性和方法就可以構(gòu)成一個(gè)對(duì)象。
這種抽象是為了把難以理解的代碼歸納成與現(xiàn)實(shí)世界關(guān)聯(lián)的概念,比如美食這樣一個(gè)對(duì)象:屬性可以歸納出“海底撈”、“自助餐”、“蓋飯”等等;方法(行為)可以歸納出“貴”、“實(shí)惠”、“便宜”等。
var fineFood = {
???name: '海底撈',
???seat: '貴賓座',
???Number: 4,
???shout: function() {
???????console.log('貴貴貴'); //這里是你的業(yè)務(wù)邏輯代碼,這里我就簡單用這個(gè)來代替
???},
???eat: function() {
???????console.log('吃土吧,哈哈!');
???},
???Reason: function() {
???????console.log('貴是有原因');
???}
};
封裝性:
對(duì)象是將數(shù)據(jù)與功能組合在一起,簡單的理解這就是封裝
Javascript對(duì)象就是鍵值對(duì)的集合,鍵值如果是數(shù)據(jù)就稱之為屬性,如果鍵值是函數(shù)就稱之為方法。
對(duì)象就是將屬性與方法封裝起來
方法將是過程封裝起來
封裝就是將抽象出來的數(shù)據(jù)與對(duì)數(shù)據(jù)的操作封裝在一起。數(shù)據(jù)被保護(hù)在內(nèi)部,程序的其他部分只有通過授權(quán)的操作才能進(jìn)行對(duì)數(shù)據(jù)進(jìn)行操作。
?JS封裝只有兩種狀態(tài),一種是公開的,一種是私有的。
function Person(name,seatl){
???this.name=name; ????????//公開
???var seat=seat; ????????????????//私有
???this.showInfo=function(){ //公開
???????window.alert(this.name+" "+seat);
???}
???function showInfo2(){ ?????//把函數(shù)私有化
???????window.alert("你好"+this.name+" "+seat);
???}
}
var p1 = new Person('Cece', 20, 10);
window.alert(p1.name + " is " +p1.age); //Cece is undefined
p1.showInfo();//Cece 20
p1.showInfo2();//報(bào)錯(cuò)
構(gòu)造函數(shù)方式與原型方式給對(duì)象添加方法的區(qū)別:
//1.通過構(gòu)造函數(shù)方式給對(duì)象添加方法
function fineFood(name){
???this.name=name;
???this.seat=function(){
???????window.alert("有請(qǐng)"+this.name + "幾位貴賓");
???}
}
var fineFood1=new fineFood("aa");
var fineFood2=new fineFood("bb");
if(fineFood1.shout==fineFood.shout){
???window.alert("相等");
}else{
???window.alert("不相等");
}
//會(huì)輸出“不相等”
//2.通過原型方式給對(duì)象添加方法
function fineFood(name){
???this.name=name; ???
}
fineFood.prototype.shout=function(){
???window.alert("有請(qǐng)"+this.name + "幾位貴賓");
}
var fineFood1=new fineFood("aa");
var fineFood2=new fineFood("bb");
if(fineFood1.shout==fineFood2.shout){
???window.alert("相等");
}else{
???window.alert("不相等");
}
//會(huì)輸出“相等”
?通過prototype給所有的對(duì)象添加方法,但是這種方式不能去訪問類的私有變量和方法;說明通過構(gòu)造函數(shù)來分配成員方法,給每個(gè)對(duì)象分配一份獨(dú)立的代碼。這樣的弊端就是如果對(duì)象實(shí)例有很多,那函數(shù)的資源占用就會(huì)很大,而且有可能造成內(nèi)存泄漏。而原型法是大家共享同一份代碼,就不會(huì)有那種弊端。
因此,通過構(gòu)造函數(shù)添加成員方法和通過原型法添加成員方法的區(qū)別:
1).通過原型法分配的函數(shù)是所有對(duì)象共享的;
2).通過原型法分配的屬性是獨(dú)立的;
3).如果希望所有的對(duì)象使用同一個(gè)函數(shù),最好使用原型法添加方法,這樣比較節(jié)省內(nèi)存。
繼承性
函數(shù)是可以繼承另外一個(gè)對(duì)象,構(gòu)造函數(shù)實(shí)例化出來的對(duì)象除了本身成員外還有擁有被繼承對(duì)象的成員。
原型鏈?zhǔn)且环N機(jī)制,指的是 JavaScript 每個(gè)對(duì)象都有一個(gè)內(nèi)置的 proto 屬性指向創(chuàng)建它的構(gòu)造函數(shù)的 prototype(原型)屬性。
原型鏈的作用是為了實(shí)現(xiàn)對(duì)象的繼承,要理解原型鏈,需要先從函數(shù)對(duì)象、constructor、new、prototype、proto 這五個(gè)入手。
函數(shù)對(duì)象?
在 JavaScript 里,函數(shù)即對(duì)象,程序可以隨意操控它們。比如,可以把函數(shù)賦值給變量,或者作為參數(shù)傳遞給其他函數(shù),也可以給它們?cè)O(shè)置屬性,甚至調(diào)用它們的方法。
// 普通對(duì)象:
var o1 = {};
var o2 = new Object();
//函數(shù)對(duì)象:
function f1(){};
var f2 = function(){};
var f3 = new Function('string','console.log(string)');
簡單的說,凡是使用 function 關(guān)鍵字或 Function 構(gòu)造函數(shù)創(chuàng)建的對(duì)象都是函數(shù)對(duì)象。而且,只有函數(shù)對(duì)象才擁有 prototype (原型)屬性。
constructor 構(gòu)造函數(shù)?
函數(shù)還有一種用法,就是把它作為構(gòu)造函數(shù)使用。像 Object 和 Array 這樣的原生構(gòu)造函數(shù)。此外,也可以創(chuàng)建自定義的構(gòu)造函數(shù),從而自定義對(duì)象類型的屬性和方法。
function Person(name, age, job){
????this.name = name;
????this.age = age;
????this.job = job;
????this.sayName = function(){
????????console.log(this.name);
????};
}
var person1 = new Person("Stone", 28, "aa");
var person2 = new Person("Sophie", 29, "bb");
我們創(chuàng)建了一個(gè)自定義構(gòu)造函數(shù) Person(),并通過該構(gòu)造函數(shù)創(chuàng)建了兩個(gè)普通對(duì)象 person1 和 person2,這兩個(gè)普通對(duì)象均包含3個(gè)屬性和1個(gè)方法。
你應(yīng)該注意到函數(shù)名 Person 使用的是大寫字母 P。按照慣例,構(gòu)造函數(shù)始終都應(yīng)該以一個(gè)大寫字母開頭,而非構(gòu)造函數(shù)則應(yīng)該以一個(gè)小寫字母開頭。這個(gè)做法借鑒自其他面向?qū)ο笳Z言,主要是為了區(qū)別于 JavaScript 中的其他函數(shù);因?yàn)闃?gòu)造函數(shù)本身也是函數(shù),只不過可以用來創(chuàng)建對(duì)象而已。
new 操作符
要?jiǎng)?chuàng)建 Person 的新實(shí)例,必須使用 new 操作符。以這種方式調(diào)用構(gòu)造函數(shù)實(shí)際上會(huì)經(jīng)歷以下4個(gè)步驟:
創(chuàng)建一個(gè)新對(duì)象;
將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此 this 就指向了這個(gè)新對(duì)象);
執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對(duì)象添加屬性);