javaScript面向对象表示
這里主要簡(jiǎn)單寫一下javaScript面向?qū)ο蟮牟粩喟l(fā)展的一些寫法和優(yōu)缺點(diǎn)。直接開門見山。
1、最簡(jiǎn)單的方式
創(chuàng)建Object的實(shí)例,為它添加屬性和方法
var car = new Object(); //創(chuàng)建實(shí)例 car.color = "red"; //為car這個(gè)對(duì)象增加顏色的屬性 car.showColor= function(){ //car的方法//處理 }?對(duì)象字面量的寫法
var car = {color : "red",showColor : function(){//處理} }?使用創(chuàng)建單個(gè)實(shí)例或是對(duì)象字面量的寫法可以創(chuàng)建單個(gè)對(duì)象,但是如果我們需要?jiǎng)?chuàng)建多個(gè)對(duì)象,以上方法就顯得很麻煩,我們必須復(fù)制一套相同的代碼,產(chǎn)生car2、car3
2、使用工廠模式創(chuàng)建對(duì)象
工廠方式創(chuàng)建對(duì)象避免了代碼的重復(fù),通過構(gòu)建工廠,大大方便了實(shí)例化
function makeCar(color){var car = new Object(); //創(chuàng)建一個(gè)實(shí)例car.color = color, //添加屬性car.showColor = function(){ //添加方法alert(this.color);} return car; //將生成的實(shí)例返回 }調(diào)用: var car1 = car("red"); var car2 = car("green");?工廠模式順利解決創(chuàng)建多個(gè)對(duì)象時(shí)編寫重復(fù)代碼的問題。而另一個(gè)方面,通過上面這種方式,我們知道,car1和car2都是通過生成Object實(shí)例在附加屬性和方法產(chǎn)生的,即他們都是Object的實(shí)例,所以我們并不能很好的知道產(chǎn)生的對(duì)象的類型。
3、構(gòu)造函數(shù)模式
function Car(color){ //一般構(gòu)造函數(shù)開頭大寫this.color = color; //添加屬性 this.showColor = function(){ //添加方法alert(this.color);} }調(diào)用: var car1 = new Car("red"); var car2 = new Car("green");?比較構(gòu)造函數(shù)模式和工廠模式我們可以看出以下區(qū)別
??? 1、在構(gòu)造函數(shù)模式里面并沒有new Object();方式創(chuàng)建實(shí)例和對(duì)此實(shí)例的賦值
??? 2、在構(gòu)造函數(shù)模式里面沒有返回創(chuàng)建的實(shí)例
??? 3、構(gòu)造函數(shù)模式直接將屬性和方法賦值給this對(duì)象
??? 4、構(gòu)造函數(shù)模式使用new 操作符產(chǎn)生Car的對(duì)象
通過上述的方法,我們就可以創(chuàng)建兩個(gè)Car的對(duì)象,解決對(duì)象識(shí)別的問題(可以使用instanceof方法檢驗(yàn))
那么使用上面的構(gòu)造方法創(chuàng)建對(duì)象是不是沒有缺點(diǎn)呢?答案是否定的,上面的代碼中的創(chuàng)建方法的方式實(shí)際上相當(dāng)于
this.showColor = new Function("alert(this.color)");
這樣的話,new出多個(gè)對(duì)象就相當(dāng)于創(chuàng)建了多個(gè)Function實(shí)例,而這個(gè)是浪費(fèi)的。于是我們可以這樣改造:
function Car(color){ //一般構(gòu)造函數(shù)開頭大寫this.color = color; //添加屬性 this.showColor = showColor; } function showColor(){ //添加方法alert(this.color); }?但是這種方法同樣存在一個(gè)缺點(diǎn),那就是會(huì)產(chǎn)生showColor這個(gè)全部的函數(shù),是函數(shù)的封裝性無法實(shí)現(xiàn)。
4、構(gòu)造函數(shù)和原型鏈方式
function Car(color){ //一般構(gòu)造函數(shù)開頭大寫this.color = color; //添加屬性 } Car.prototype = { constructor : Car,showColor : function(){alert(this.color);} }?我們需要知道的是,使用原型鏈定義方法和共享的屬性可以通過引用的方式共享,可以最大程度的節(jié)約內(nèi)存,這是采用度較高的一種方式。
轉(zhuǎn)載于:https://www.cnblogs.com/sheilooblog/p/5252291.html
總結(jié)
以上是生活随笔為你收集整理的javaScript面向对象表示的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 通过反射获取调用类方法及属性
- 下一篇: 求值