摘要:前言面向?qū)ο缶幊淌菍⑿枨蟪橄蟪梢粋€對象,針對對象分析其特征屬性和動作方法。面向?qū)ο缶幊趟枷肫渲幸粋€特點就是封裝,就是把需要的功能放在一個對象里。將閉包作為創(chuàng)建對象的構(gòu)造函數(shù)。
前言
面向?qū)ο缶幊淌菍⑿枨蟪橄蟪梢粋€對象,針對對象分析其特征(屬性)和動作(方法)。這個對象我們稱之為類。面向?qū)ο缶幊趟枷肫渲幸粋€特點就是封裝,就是把需要的功能放在一個對象里。但是JavaScript這種解釋性的弱類型語言沒有經(jīng)典強類型語言中通過關(guān)鍵字class來實現(xiàn)類的封裝,JavaScript都是通過一些特性模仿實現(xiàn)的,這也讓JavaScript有更高的靈活性。
封裝為類添加屬性和方法的兩種方式
在函數(shù)(類)的內(nèi)部通過this添加屬性和方法
//創(chuàng)建類,通過this實現(xiàn)對類添加屬性和方法 var Book = function (id, bookname, price) { this.id = id; this.bookname = bookname; this.price = price; }
通過在類的原型上添加屬性和方法
1)為原型對象屬性賦值
Book.prototype.display = function () { }
2)將一個對象賦值給類的原型對象
Book.prototype = { display :function () { } }
這樣就將需要的方法和屬性封裝在抽象的Book類中,當(dāng)使用功能方法時,不能直接使用Book類,而需要new關(guān)鍵字來實例化(創(chuàng)建)新的對象。
注意:通過this添加的屬性和方法是在當(dāng)前對象上添加的,而通過JavaScript是一種基于原型prototype的語言,所以每創(chuàng)建一個對象時,都有一個原型prototype用于指向其繼承的屬性、方法。這樣通過prototype繼承的方法并不是對象自身的。所以每次通過類創(chuàng)建一個新對象時,this指向的屬性和方法都會得到相應(yīng)的創(chuàng)建,但是通過prototype繼承的屬性和方法是每個對象通過prototype訪問到,這些屬性和方法不會再次創(chuàng)建。
通過this創(chuàng)建的屬性是公有屬性,通過this創(chuàng)建的方法是特權(quán)方法,在創(chuàng)建對象時調(diào)用特權(quán)方法可以看做是類的構(gòu)造器。通過new關(guān)鍵字創(chuàng)建新對象時,由于類外面通過點語法添加的屬性和方法沒有執(zhí)行到,所以新創(chuàng)建的對象中無法獲取到,而prototype創(chuàng)建的屬性或方法可以訪問到,所以prototype對象中的屬性和方法稱為共有屬性和方法。
如下:
var Book = function (id, name, price) { } Book.isChinese = true; Book.prototype = { isJsBook : false, display :function () {} } var b = new Book(11,"ava", 30); console.log(b.isJsBook); //false console.log(b.id); // 11 console.log(b.idChinese); //undefined console.log(Book.isChinese);// true閉包實現(xiàn)
閉包是有權(quán)訪問另一個函數(shù)作用域中變量的函數(shù),即在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。將閉包作為創(chuàng)建對象的構(gòu)造函數(shù)。
//利用閉包實現(xiàn) var Book =(function () { var bookNum = 0; function checkBook(name) {} function book(newId,newName,newPrice) { var name,price; function checkId() {} this.getName = function(){}; this.getPrice = function () {}; this.setName = function () {}; this.setPrice = function () {}; this.id = newId; this.copy = function () {}; bookNum++ if(bookNum>100){ throw new Error("100本書"); } this.setName(name); this.setName(price); } _book.prototype = { isJsBook :false, display:function () {} }; return _book; })();
由于在創(chuàng)建對象上這種寫法容易忘記使用new而犯錯誤,所以可以使用安全模式創(chuàng)建對象,也就是在創(chuàng)建對象過程中用instanceof判斷this是否是當(dāng)前這個對象。
if(this instanceof Book){ ... }else{ return new Book() }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/97838.html
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:在中,并沒有對抽象類和接口的支持。例如,當(dāng)對象需要對象的能力時,可以有選擇地把對象的構(gòu)造器的原型指向?qū)ο螅瑥亩_到繼承的效果。本節(jié)內(nèi)容為設(shè)計模式與開發(fā)實踐第一章筆記。 動態(tài)類型語言 編程語言按數(shù)據(jù)類型大體可以分為兩類:靜態(tài)類型語言與動態(tài)類型語言。 靜態(tài)類型語言在編譯時已確定變量類型,動態(tài)類型語言的變量類型要到程序運行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...
摘要:面向?qū)ο竺嫦驅(qū)ο蟮母攀雒嫦驅(qū)ο笫鞘裁疵嫦驅(qū)ο缶幊痰娜Q是,簡稱。面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實世界模型的一種編程。面向?qū)ο缶幊炭梢钥醋鍪鞘褂靡幌盗袑ο笙嗷f(xié)作的軟件設(shè)計。面向?qū)ο缶幊痰纳礁柚饕奶卣魇欠庋b繼承多態(tài)。 面向?qū)ο?面向?qū)ο蟮母攀?面向?qū)ο笫鞘裁?面向?qū)ο缶幊痰娜Q是Object Oriented Programming,簡稱OOP。面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實...
閱讀 1785·2021-11-15 11:37
閱讀 3056·2021-11-04 16:05
閱讀 1923·2021-10-27 14:18
閱讀 2755·2021-08-12 13:30
閱讀 2500·2019-08-29 14:18
閱讀 2086·2019-08-29 13:07
閱讀 2024·2019-08-27 10:54
閱讀 2726·2019-08-26 12:15