javascript的面向?qū)ο筇匦允鞘裁?創(chuàng)新互聯(lián)

這篇文章主要介紹“javascript的面向?qū)ο筇匦允鞘裁础?,在日常操作中,相信很多人在javascript的面向?qū)ο筇匦允鞘裁磫?wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”javascript的面向?qū)ο筇匦允鞘裁础钡囊苫笥兴鶐椭?!接下?lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)定制網(wǎng)站,是成都網(wǎng)站營(yíng)銷公司,為成都辦公窗簾提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開發(fā)等。成都網(wǎng)站改版熱線:028-86922220

面向?qū)ο蟮娜蠡咎匦?/strong>

封裝(把相關(guān)的信息(無(wú)論數(shù)據(jù)或方法)存儲(chǔ)在對(duì)象中的能力)

繼承(由另一個(gè)類(或多個(gè)類)得來(lái)類的屬性和方法的能力)

多態(tài)(一個(gè)對(duì)象在不同情況下的多種形態(tài))

定義類或?qū)ο?/strong>

第一種:基于Object對(duì)象

var person = new Object();
person.name = "Rose";
person.age = 18;
person.getName = function () {
 return this.name;
};
console.log(person.name);//Rose
console.log(person.getName);//function () {return this.name;}
console.log(person.getName());//Rose

缺點(diǎn):不能創(chuàng)建多個(gè)對(duì)象。

第二種:基于字面量方式

var person = {
 name : "Rose",
 age : 18 ,
 getName : function () {
  return this.name;
 }
};
console.log(person.name);//Rose
console.log(person.getName);//function () {return this.name;}
console.log(person.getName());//Rose

優(yōu)點(diǎn):比較清楚的查找對(duì)象包含的屬性和方法;

缺點(diǎn):不能創(chuàng)建多個(gè)對(duì)象。

第三種:工廠模式

方式一:

function createPerson(name,age) {
 var object = new Object();
 object.name = name;
 object.age = age;
 object.getName = function () {
  return this.name;
 };
 return object;
}
var person1 = createPerson("Rose",18);
var person2 = createPerson("Jack",20);
console.log(person1.name);//Rose
console.log(person2.name);//Jack
console.log(person1.getName === person2.getName);//false//重復(fù)生成函數(shù),為每個(gè)對(duì)象都創(chuàng)建獨(dú)立的函數(shù)版本

優(yōu)點(diǎn):可以創(chuàng)建多個(gè)對(duì)象;

缺點(diǎn):重復(fù)生成函數(shù)getName(),為每個(gè)對(duì)象都創(chuàng)建獨(dú)立的函數(shù)版本。

方式二:

function createPerson(name,age) {
 var object = new Object();
 object.name = name;
 object.age = age;
 object.getName = getName;
 return object;
}
function getName() {
 return this.name;
}
var person1 = createPerson("Rose",18);
var person2 = createPerson("Jack",20);
console.log(person1.name);//Rose
console.log(person2.name);//Jack
console.log(person1.getName === person2.getName);//true//共享同一個(gè)函數(shù)

優(yōu)點(diǎn):可以創(chuàng)建多個(gè)對(duì)象;

缺點(diǎn):從語(yǔ)義上講,函數(shù)getName()不太像是Person對(duì)象的方法,辨識(shí)度不高。

第四種:構(gòu)造函數(shù)方式

方式一:

function Person(name,age) {
 this.name = name;
 this.age = age;
 this.getName = function () {
  return this.name;
 }
}
var person1 = new Person("Rose",18);
var person2 = new Person("Jack",20);
console.log(person1.name);//Rose
console.log(person2.name);//Jack
console.log(person1.getName === person2.getName); //false//重復(fù)生成函數(shù),為每個(gè)對(duì)象都創(chuàng)建獨(dú)立的函數(shù)版本

優(yōu)點(diǎn):可以創(chuàng)建多個(gè)對(duì)象;

缺點(diǎn):重復(fù)生成函數(shù)getName(),為每個(gè)對(duì)象都創(chuàng)建獨(dú)立的函數(shù)版本。

方式二:

function Person(name,age) {
 this.name = name;
 this.age = age;
 this.getName = getName ;
}
function getName() {
 return this.name;
}
var person1 = new Person("Rose",18);
var person2 = new Person("Jack",20);
console.log(person1.name);//Rose
console.log(person2.name);//Jack
console.log(person1.getName === person2.getName); //true//共享同一個(gè)函數(shù)

優(yōu)點(diǎn):可以創(chuàng)建多個(gè)對(duì)象;

缺點(diǎn):從語(yǔ)義上講,函數(shù)getName()不太像是Person對(duì)象的方法,辨識(shí)度不高。

第五種:原型方式

function Person() {
}
Person.prototype.name = 'Rose';
Person.prototype.age = 18;
Person.prototype.getName = function () {
 return this.name;
};
var person1 = new Person();
var person2 = new Person();
console.log(person1.name);//Rose
console.log(person2.name);//Rose//共享同一個(gè)屬性
console.log(person1.getName === person2.getName);//true//共享同一個(gè)函數(shù)

缺點(diǎn):它省略了為構(gòu)造函數(shù)傳遞初始化參數(shù),這在一定程序帶來(lái)不便;另外,最主要是當(dāng)對(duì)象的屬性是引用類型時(shí),它的值是不變的,總是引用同一個(gè)外部對(duì)象,所有實(shí)例對(duì)該對(duì)象的操作都會(huì)影響其它實(shí)例:

function Person() {
}
Person.prototype.name = 'Rose';
Person.prototype.age = 18;
Person.prototype.lessons = ["語(yǔ)文","數(shù)學(xué)"];
Person.prototype.getName = function () {
 return this.name;
};
var person1 = new Person();
person1.lessons.push("英語(yǔ)");
var person2 = new Person();
console.log(person1.lessons);//["語(yǔ)文", "數(shù)學(xué)", "英語(yǔ)"]
console.log(person2.lessons);//["語(yǔ)文", "數(shù)學(xué)", "英語(yǔ)"]//person1修改影響了person2

第六種:構(gòu)造函數(shù)+原型方式(推薦)

function Person(name,age) {
 this.name = name;
 this.age = age;
}
Person.prototype.getName = function () {
 return this.name;
};
var person1 = new Person('Rose', 18);
var person2 = new Person('Jack', 20);
console.log(person1.name);//Rose
console.log(person2.name);//Jack
console.log(person1.getName === person2.getName);//true//共享原型中定義的方法

缺點(diǎn):屬性定義在構(gòu)造函數(shù)內(nèi),方法定義在構(gòu)造函數(shù)外,與面向?qū)ο蟮姆庋b思想不符。

第七種:構(gòu)造函數(shù)+動(dòng)態(tài)原型方式(推薦)

方式一:

function Person(name,age) {
 this.name = name;
 this.age = age;
 if (typeof Person._getName === "undefined"){
  Person.prototype.getName = function () {
   return this.name;
  };
  Person._getName = true;
 }
}
var person1 = new Person('Rose', 18);
var person2 = new Person('Jack', 20);
console.log(person1.name);//Rose
console.log(person2.name);//Jack
console.log(person1.getName === person2.getName);//true//共享原型中定義的方法

方式二:

function Person(name,age) {
 this.name = name;
 this.age = age;
 if (typeof this.getName !== "function"){
  Person.prototype.getName = function () {
   return this.name;
  };
 }
}
var person1 = new Person('Rose', 18);
var person2 = new Person('Jack', 20);
console.log(person1.name);//Rose
console.log(person2.name);//Jack
console.log(person1.getName === person2.getName);//true//共享原型中定義的方法

對(duì)象屬性的擴(kuò)展及刪除

Javascript的對(duì)象可以使用 '.' 操作符動(dòng)態(tài)的擴(kuò)展其屬性,可以使用 'delete' 關(guān)鍵字或?qū)傩缘闹翟O(shè)置為 'undefined' 來(lái)刪除屬性。

function Person(name,age) {
 this.name = name;
 this.age = age;
 if (typeof Person._getName === "undefined"){
  Person.prototype.getName = function () {
   return this.name;
  };
  Person._getName = true;
 }
}
var person = new Person("Rose",18);
person.job = 'Engineer';//添加屬性
console.log(person.job);//Engineer
delete person.job;//刪除屬性
console.log(person.job);//undefined//刪除屬性后值為undefined
person.age = undefined;//刪除屬性
console.log(person.age);//undefined//刪除屬性后值為undefined

對(duì)象屬性類型

數(shù)據(jù)屬性

特性:

[configurable]:表示能否使用delete操作符刪除從而重新定義,或能否修改為訪問(wèn)器屬性。默認(rèn)為true;

[enumberable]:表示是否可通過(guò)for-in循環(huán)返回屬性。默認(rèn)true;

[writable]:表示是否可修改屬性的值。默認(rèn)true;

[value]:包含該屬性的數(shù)據(jù)值。讀取/寫入都是該值。默認(rèn)為undefined;如上面實(shí)例對(duì)象person中定義了name屬性,其值為'My name',對(duì)該值的修改都反正在這個(gè)位置

function Person(name,age) {
 this.name = name;
 this.age = age;
 if (typeof Person._getName === "undefined"){
  Person.prototype.getName = function () {
   return this.name;
  };
  Person._getName = true;
 }
}
var person = new Person("Rose",18);
Object.defineProperty(person,"name",{configurable:false,writable:false});
person.name = "Jack";
console.log(person.name);//Rose//重新賦值無(wú)效
delete person.name;
console.log(person.name);//Rose//刪除無(wú)效

注意:

一旦將configurable設(shè)置為false,則無(wú)法再使用defineProperty將其修改為true(執(zhí)行會(huì)報(bào)錯(cuò):cannot redefine property : propertyName)

function Person(name,age) {
 this.name = name;
 this.age = age;
 if (typeof Person._getName === "undefined"){
  Person.prototype.getName = function () {
   return this.name;
  };
  Person._getName = true;
 }
}
var person = new Person("Rose",18);
Object.defineProperty(person,"name",{configurable:false,writable:false});
person.name = "Jack";
console.log(person.name);//Rose//重新賦值無(wú)效
delete person.name;
console.log(person.name);//Rose//刪除無(wú)效
Object.defineProperty(person,"name",{configurable:true,writable:true});//Cannot redefine property: name

訪問(wèn)器屬性

特性:

[configurable]:是否可通過(guò)delete操作符刪除重新定義屬性;

[numberable]:是否可通過(guò)for-in循環(huán)查找該屬性;

[get]:讀取屬性時(shí)調(diào)用,默認(rèn):undefined;

[set]:寫入屬性時(shí)調(diào)用,默認(rèn):undefined;

訪問(wèn)器屬性不能直接定義,必須使用defineProperty()或defineProperties來(lái)定義:如下

function Person(name,age) {
 this.name = name;
 this._age = age;
 if (typeof Person._getName === "undefined"){
  Person.prototype.getName = function () {
   return this.name;
  };
  Person._getName = true;
 }
}
var person = new Person("Rose",18);
Object.defineProperty(person,"age",{
 get:function () {
  return this._age;
 },
 set:function (age) {
  this._age = age;
 }});
person.age = 20;
console.log(person.age);//20//person.age=20是使用set方法將20賦值給_age,person.age是使用get方法將_age的讀取出來(lái)
console.log(person._age);//20

獲取所有的屬性和屬性的特性

使用Object.getOwnPropertyNames(object)方法可以獲取所有的屬性;

使用Object.getOwnPropertyDescriptor(object,property)方法可以取得給定屬性的特性;

function Person(name,age) {
 this.name = name;
 this._age = age;
 if (typeof Person._getName === "undefined"){
  Person.prototype.getName = function () {
   return this.name;
  };
  Person._getName = true;
 }
}
var person = new Person("Rose",18);
Object.defineProperty(person,"age",{
 get:function () {
  return this._age;
 },
 set:function (age) {
  this._age = age;
 }});
console.log(Object.getOwnPropertyNames(person));//["name", "_age", "age"]
console.log(Object.getOwnPropertyDescriptor(person,"age"));//{enumerable: false, configurable: false, get: function, set: function}

對(duì)于數(shù)據(jù)屬性,可以取得:configurable,enumberable,writable和value;

對(duì)于訪問(wèn)器屬性,可以取得:configurable,enumberable,get和set;

繼承機(jī)制實(shí)現(xiàn)

對(duì)象冒充

function Father(name) {
 this.name = name ;
 this.getName = function () {
  return this.name;
 }
}
function Son(name,age) {
 this._newMethod = Father;
 this._newMethod(name);
 delete this._newMethod;

 this.age = age;
 this.getAge = function () {
  return this.age;
 }
}
var father = new Father("Tom");
var son = new Son("Jack",18);
console.log(father.getName());//Tom
console.log(son.getName());//Jack//繼承父類getName()方法
console.log(son.getAge());//18

多繼承(利用對(duì)象冒充可以實(shí)現(xiàn)多繼承)

function FatherA(name) {
 this.name = name ;
 this.getName = function () {
  return this.name;
 }
}
function FatherB(job) {
 this.job = job;
 this.getJob = function () {
  return this.job;
 }
}
function Son(name,job,age) {
 this._newMethod = FatherA;
 this._newMethod(name);
 delete this._newMethod;
 this._newMethod = FatherB;
 this._newMethod(job);
 delete this._newMethod;

 this.age = age;
 this.getAge = function () {
  return this.age;
 }
}
var fatherA = new FatherA("Tom");
var fatherB = new FatherB("Engineer");
var son = new Son("Jack","Programmer",18);
console.log(fatherA.getName());//Tom
console.log(fatherB.getJob());//Engineer
console.log(son.getName());//Jack//繼承父類FatherA的getName()方法
console.log(son.getJob());//Programmer//繼承父類FatherB的getJob()方法
console.log(son.getAge());//18

call()方法

function Father(name) {
 this.name = name ;
 this.getName = function () {
  return this.name;
 }
}
function Son(name,job,age) {
 Father.call(this,name);

 this.age = age;
 this.getAge = function () {
  return this.age;
 }
}
var father = new Father("Tom");
var son = new Son("Jack","Programmer",18);
console.log(father.getName());//Tom
console.log(son.getName());//Jack//繼承父類getName()方法
console.log(son.getAge());//18

多繼承(利用call()方法實(shí)現(xiàn)多繼承)

function FatherA(name) {
 this.name = name ;
 this.getName = function () {
  return this.name;
 }
}
function FatherB(job) {
 this.job = job;
 this.getJob = function () {
  return this.job;
 }
}
function Son(name,job,age) {
 FatherA.call(this,name);
 FatherB.call(this,job);

 this.age = age;
 this.getAge = function () {
  return this.age;
 }
}
var fatherA = new FatherA("Tom");
var fatherB = new FatherB("Engineer");
var son = new Son("Jack","Programmer",18);
console.log(fatherA.getName());//Tom
console.log(fatherB.getJob());//Engineer
console.log(son.getName());//Jack//繼承父類FatherA的getName()方法
console.log(son.getJob());//Programmer//繼承父類FatherB的getJob()方法
console.log(son.getAge());//18

apply()方法

function Father(name) {
 this.name = name ;
 this.getName = function () {
  return this.name;
 }
}
function Son(name,job,age) {
 Father.apply(this,new Array(name));

 this.age = age;
 this.getAge = function () {
  return this.age;
 }
}
var father = new Father("Tom");
var son = new Son("Jack","Programmer",18);
console.log(father.getName());//Tom
console.log(son.getName());//Jack//繼承父類getName()方法
console.log(son.getAge());//18

多繼承(利用apply()方法實(shí)現(xiàn)多繼承)

function FatherA(name) {
 this.name = name ;
 this.getName = function () {
  return this.name;
 }
}
function FatherB(job) {
 this.job = job;
 this.getJob = function () {
  return this.job;
 }
}
function Son(name,job,age) {
 FatherA.apply(this,new Array(name));
 FatherB.apply(this,new Array(job));

 this.age = age;
 this.getAge = function () {
  return this.age;
 }
}
var fatherA = new FatherA("Tom");
var fatherB = new FatherB("Engineer");
var son = new Son("Jack","Programmer",18);
console.log(fatherA.getName());//Tom
console.log(fatherB.getJob());//Engineer
console.log(son.getName());//Jack//繼承父類FatherA的getName()方法
console.log(son.getJob());//Programmer//繼承父類FatherB的getJob()方法
console.log(son.getAge());//18

原型鏈方法

function Father() {
}
Father.prototype.name = "Tom";
Father.prototype.getName = function () {
 return this.name;
};
function Son() {
}
Son.prototype = new Father();
Son.prototype.age = 18;
Son.prototype.getAge = function () {
 return this.age;
};
var father = new Father();
var son = new Son();
console.log(father.getName());//Tom
console.log(son.getName());//Tom//繼承父類FatherA的getName()方法
console.log(son.getAge());//18

混合方式(call()+原型鏈)

function Father(name) {
 this.name = name;
}
Father.prototype.getName = function () {
 return this.name;
};
function Son(name,age) {
 Father.call(this,name);
 this.age = age;
}
Son.prototype = new Father();
Son.prototype.getAge = function () {
 return this.age;
};
var father = new Father("Tom");
var son = new Son("Jack",18);
console.log(father.getName());//Tom
console.log(son.getName());//Jack//繼承父類Father的getName()方法
console.log(son.getAge());//18

多態(tài)機(jī)制實(shí)現(xiàn)

function Person(name) {
 this.name = name;
 if (typeof this.getName !== "function"){
  Person.prototype.getName = function () {
   return this.name;
  }
 }
 if (typeof this.toEat !== "function"){
  Person.prototype.toEat = function (animal) {
   console.log( this.getName() + "說(shuō)去吃飯:");
   animal.eat();
  }
 }
}
function Animal(name) {
 this.name = name;
 if (typeof this.getName !== "function"){
  Animal.prototype.getName = function () {
   return this.name;
  }
 }
}
function Cat(name) {
 Animal.call(this,name);
 if (typeof this.eat !== "function"){
  Cat.prototype.eat = function () {
   console.log(this.getName() + "吃魚");
  }
 }
}
Cat.prototype = new Animal();
function Dog(name) {
 Animal.call(this,name);
 if (typeof this.eat !== "function"){
  Dog.prototype.eat = function () {
   console.log(this.getName() + "啃骨頭");
  }
 }
}
Dog.prototype = new Animal();

var person = new Person("Tom");
person.toEat(new Cat("cat"));//Tom說(shuō)去吃飯:cat吃魚
person.toEat(new Dog("dog"));//Tom說(shuō)去吃飯:dog啃骨頭

到此,關(guān)于“javascript的面向?qū)ο筇匦允鞘裁础钡膶W(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)成都做網(wǎng)站網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

名稱欄目:javascript的面向?qū)ο筇匦允鞘裁?創(chuàng)新互聯(lián)
URL標(biāo)題:http://muchs.cn/article10/eihgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)網(wǎng)站導(dǎo)航、品牌網(wǎng)站制作網(wǎng)頁(yè)設(shè)計(jì)公司、商城網(wǎng)站手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)