电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JS面向對象編程基礎篇(二) 封裝操作實例詳解

瀏覽:144日期:2024-05-22 17:50:32

本文實例講述了JS面向對象編程封裝操作。分享給大家供大家參考,具體如下:

Javascript是一種基于對象(object-based)的語言,你遇到的所有東西幾乎都是對象。但是,它又不是一種真正的面向對象編程(OOP)語言,因為它的語法中沒有class(類)。

那么,如果我們要把'屬性'(property)和'方法'(method),封裝成一個對象,甚至要從原型對象生成一個實例對象,我們應該怎么做呢?

封裝

一、 生成實例對象的原始模式

假定我們把貓看成一個對象,它有'名字'和'顏色'兩個屬性。

var Cat = {

name : ’’, color : ’’ }

現在,我們需要根據這個原型對象的規格(schema),生成兩個實例對象。

var cat1 = {}; // 創建一個空對象cat1.name = '大毛'; // 按照原型對象的屬性賦值cat1.color = '黃色';var cat2 = {};cat2.name = '二毛';cat2.color = '黑色';

好了,這就是最簡單的封裝了,把兩個屬性封裝在一個對象里面。但是,這樣的寫法有兩個缺點,一是如果多生成幾個實例,寫起來就非常麻煩;二是實例與原型之間,沒有任何辦法,可以看出有什么聯系。

二、 原始模式的改進

我們可以寫一個函數,解決代碼重復的問題。

function Cat(name,color) {return {name:name,color:color}}

然后生成實例對象,就等于是在調用函數:

var cat1 = Cat('大毛','黃色');var cat2 = Cat('二毛','黑色');

這種方法的問題依然是,cat1和cat2之間沒有內在的聯系,不能反映出它們是同一個原型對象的實例。

三、 構造函數模式

為了解決從原型對象生成實例的問題,Javascript提供了一個構造函數(Constructor)模式。

所謂'構造函數',其實就是一個普通函數,但是內部使用了this變量。對構造函數使用new運算符,就能生成實例,并且this變量會綁定在實例對象上。

比如,貓的原型對象現在可以這樣寫,

function Cat(name,color){this.name=name;this.color=color;}

我們現在就可以生成實例對象了。

var cat1 = new Cat('大毛','黃色');var cat2 = new Cat('二毛','黑色');console.log(cat1.name); // 大毛console.log(cat1.color); // 黃色

這時cat1和cat2會自動含有一個constructor屬性,指向它們的構造函數。

console.log(cat1.constructor == Cat); //trueconsole.log(cat2.constructor == Cat); //true

Javascript還提供了一個instanceof運算符,驗證原型對象與實例對象之間的關系。

console.log(cat1 instanceof Cat); //trueconsole.log(cat2 instanceof Cat); //true

四、構造函數模式的問題

構造函數方法很好用,但是存在一個浪費內存的問題。

請看,我們現在為Cat對象添加一個不變的屬性type(種類),再添加一個方法eat(吃)。那么,原型對象Cat就變成了下面這樣:

function Cat(name,color){this.name = name;this.color = color;this.type = '貓科動物';this.eat = function(){console.log('吃老鼠');};}

還是采用同樣的方法,生成實例:

var cat1 = new Cat('大毛','黃色');var cat2 = new Cat ('二毛','黑色');console.log(cat1.type); // 貓科動物cat1.eat(); // 吃老鼠

表面上好像沒什么問題,但是實際上這樣做,有一個很大的弊端。那就是對于每一個實例對象,type屬性和eat()方法都是一模一樣的內容,每一次生成一個實例,都必須為重復的內容,多占用一些內存。這樣既不環保,也缺乏效率。

console.log(cat1.eat == cat2.eat); //false

能不能讓type屬性和eat()方法在內存中只生成一次,然后所有實例都指向那個內存地址呢?回答是可以的。

五、 Prototype模式

Javascript規定,每一個構造函數都有一個prototype屬性,指向另一個對象。這個對象的所有屬性和方法,都會被構造函數的實例繼承。

這意味著,我們可以把那些不變的屬性和方法,直接定義在prototype對象上。

function Cat(name,color){this.name = name;this.color = color;}Cat.prototype.type = '貓科動物';Cat.prototype.eat = function(){console.log('吃老鼠')};

然后,生成實例。

var cat1 = new Cat('大毛','黃色');var cat2 = new Cat('二毛','黑色');console.log(cat1.type); // 貓科動物cat1.eat(); // 吃老鼠

這時所有實例的type屬性和eat()方法,其實都是同一個內存地址,指向prototype對象,因此就提高了運行效率。

console.log(cat1.eat == cat2.eat); //true

六、 Prototype模式的驗證方法

為了配合prototype屬性,Javascript定義了一些輔助方法,幫助我們使用它。,

6.1 isPrototypeOf()

這個方法用來判斷,某個proptotype對象和某個實例之間的關系。

console.log(Cat.prototype.isPrototypeOf(cat1)); //trueconsole.log(Cat.prototype.isPrototypeOf(cat2)); //true

6.2 hasOwnProperty()

每個實例對象都有一個hasOwnProperty()方法,用來判斷某一個屬性到底是本地屬性,還是繼承自prototype對象的屬性。

console.log(cat1.hasOwnProperty('name')); // trueconsole.log(cat1.hasOwnProperty('type')); // false

6.3 in運算符

in運算符可以用來判斷,某個實例是否含有某個屬性,不管是不是本地屬性。

console.log('name' in cat1); // trueconsole.log('type' in cat1); // true

in運算符還可以用來遍歷某個對象的所有屬性。

for(var prop in cat1) { console.log('cat1['+prop+']='+cat1[prop]); }

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 生物风-销售载体,基因,质粒,ATCC细胞,ATCC菌株等,欢迎购买-百风生物 | 不锈钢反应釜,不锈钢反应釜厂家-价格-威海鑫泰化工机械有限公司 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 | 航空连接器,航空插头,航空插座,航空接插件,航插_深圳鸿万科 | 长江船运_国内海运_内贸船运_大件海运|运输_船舶运输价格_钢材船运_内河运输_风电甲板船_游艇运输_航运货代电话_上海交航船运 | 苗木价格-苗木批发-沭阳苗木基地-沭阳花木-长之鸿园林苗木场 | 中医中药治疗血小板减少-石家庄血液病肿瘤门诊部 | 防火门|抗爆门|超大门|医疗门|隔声门-上海加汇门业生产厂家 | 啤酒设备-小型啤酒设备-啤酒厂设备-济南中酿机械设备有限公司 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 精益专家 - 设备管理软件|HSE管理系统|设备管理系统|EHS安全管理系统 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 液晶拼接屏厂家_拼接屏品牌_拼接屏价格_监控大屏—北京维康 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 商秀—企业短视频代运营_抖音企业号托管| 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 丽陂特官网_手机信号屏蔽器_Wifi信号干扰器厂家_学校考场工厂会议室屏蔽仪 | 动物麻醉机-数显脑立体定位仪-北京易则佳科技有限公司 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 创客匠人-让IP变现不走弯路| 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | 办公室家具公司_办公家具品牌厂家_森拉堡办公家具【官网】 | 10吨无线拉力计-2吨拉力计价格-上海佳宜电子科技有限公司 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 液氮罐_液氮容器_自增压液氮罐-北京君方科仪科技发展有限公司 | 嘉兴泰东园林景观工程有限公司_花箱护栏 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 上海办公室装修,写字楼装修—启鸣装饰设计工程有限公司 | 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 【黄页88网】-B2B电子商务平台,b2b平台免费发布信息网 | 微妙网,专业的动画师、特效师、CG模型设计师网站! - wmiao.com 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 微波萃取合成仪-电热消解器价格-北京安合美诚科学仪器有限公司 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 深圳市超时尚职业培训学校,培训:月嫂,育婴,养老,家政;化妆,美容,美发,美甲. |