摘要:前言面向對象編程是將需求抽象成一個對象,針對對象分析其特征屬性和動作方法。面向對象編程思想其中一個特點就是封裝,就是把需要的功能放在一個對象里。將閉包作為創建對象的構造函數。
前言
面向對象編程是將需求抽象成一個對象,針對對象分析其特征(屬性)和動作(方法)。這個對象我們稱之為類。面向對象編程思想其中一個特點就是封裝,就是把需要的功能放在一個對象里。但是JavaScript這種解釋性的弱類型語言沒有經典強類型語言中通過關鍵字class來實現類的封裝,JavaScript都是通過一些特性模仿實現的,這也讓JavaScript有更高的靈活性。
封裝為類添加屬性和方法的兩種方式
在函數(類)的內部通過this添加屬性和方法
//創建類,通過this實現對類添加屬性和方法 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類中,當使用功能方法時,不能直接使用Book類,而需要new關鍵字來實例化(創建)新的對象。
注意:通過this添加的屬性和方法是在當前對象上添加的,而通過JavaScript是一種基于原型prototype的語言,所以每創建一個對象時,都有一個原型prototype用于指向其繼承的屬性、方法。這樣通過prototype繼承的方法并不是對象自身的。所以每次通過類創建一個新對象時,this指向的屬性和方法都會得到相應的創建,但是通過prototype繼承的屬性和方法是每個對象通過prototype訪問到,這些屬性和方法不會再次創建。
通過this創建的屬性是公有屬性,通過this創建的方法是特權方法,在創建對象時調用特權方法可以看做是類的構造器。通過new關鍵字創建新對象時,由于類外面通過點語法添加的屬性和方法沒有執行到,所以新創建的對象中無法獲取到,而prototype創建的屬性或方法可以訪問到,所以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閉包實現
閉包是有權訪問另一個函數作用域中變量的函數,即在一個函數內部創建另一個函數。將閉包作為創建對象的構造函數。
//利用閉包實現 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; })();
由于在創建對象上這種寫法容易忘記使用new而犯錯誤,所以可以使用安全模式創建對象,也就是在創建對象過程中用instanceof判斷this是否是當前這個對象。
if(this instanceof Book){ ... }else{ return new Book() }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97838.html
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:在中,并沒有對抽象類和接口的支持。例如,當對象需要對象的能力時,可以有選擇地把對象的構造器的原型指向對象,從而達到繼承的效果。本節內容為設計模式與開發實踐第一章筆記。 動態類型語言 編程語言按數據類型大體可以分為兩類:靜態類型語言與動態類型語言。 靜態類型語言在編譯時已確定變量類型,動態類型語言的變量類型要到程序運行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...
摘要:面向對象面向對象的概述面向對象是什么面向對象編程的全稱是,簡稱。面向對象編程是用抽象方式創建基于現實世界模型的一種編程。面向對象編程可以看做是使用一系列對象相互協作的軟件設計。面向對象編程的山歌主要的特征是封裝繼承多態。 面向對象 面向對象的概述 面向對象是什么 面向對象編程的全稱是Object Oriented Programming,簡稱OOP。面向對象編程是用抽象方式創建基于現實...
閱讀 1772·2021-11-15 11:37
閱讀 3044·2021-11-04 16:05
閱讀 1910·2021-10-27 14:18
閱讀 2742·2021-08-12 13:30
閱讀 2486·2019-08-29 14:18
閱讀 2076·2019-08-29 13:07
閱讀 2004·2019-08-27 10:54
閱讀 2714·2019-08-26 12:15