Everything is object (萬物皆對象)。
對象究竟是什麼,咱們能夠從兩個層次來理解。javascript
1.對象是單個事物的抽象java
一本書、一輛汽車、一我的均可以是對象,一個數據庫、一張網頁、一個與遠程服務器的鏈接也能夠是對象。當實物被抽象成對象,實物之間的關係就變成了對象之間的關係,從而就能夠模擬現實狀況,針對對象進行編程。
程序員
2.對象是一個容器,封裝了屬性(property)和方法(method)數據庫
屬性是對象的狀態,方法是對象的行爲(完成某種任務)。好比,咱們能夠把動物抽象爲animal對象,使用「屬性」記錄具體是那一種動物,使用「方法」表示動物的某種行爲(奔跑、捕獵、休息等等)
編程
在實際開發中,對象是一個抽象的概念,能夠將其簡單理解爲 : 數據集或功能集。
面向對象編程是用抽象方式建立基於現實世界模型的一種編程模式。它使用先前創建的範例,包括模塊化,多態和封裝幾種技術。今天,許多流行的編程語言(如Java,JavaScript,C#,C+ +,Python,PHP,Ruby和Objective-C)都支持面向對象編程(OOP)。服務器
相對於「一個程序只是一些函數的集合,或簡單的計算機指令列表。」的傳統軟件設計觀念而言,面向對象編程能夠看做是使用一系列對象相互協做的軟件設計。 在 OOP 中,每一個對象可以接收消息,處理數據和發送消息給其餘對象。每一個對象均可以被看做是一個擁有清晰角色或責任的獨立小機器。數據結構
面向對象程序設計的目的是在編程中促進更好的靈活性和可維護性,在大型軟件工程中廣爲流行。憑藉其對模塊化的重視,面向對象的代碼開發更簡單,更容易理解,相比非模塊化編程方法 1, 它能更直接地分析, 編碼和理解複雜的狀況和過程。編程語言
面向對象編程 —— Object Oriented Programming,簡稱 OOP ,是一種編程開發思想。
它將真實世界各類複雜的關係,抽象爲一個個對象,而後由對象之間的分工與合做,完成對真實世界的模擬。
在面向對象程序開發思想中,每個對象都是功能中心,具備明確分工,能夠完成接受信息、處理數據、發出信息等任務。
所以,面向對象編程具備靈活、代碼可複用、高度模塊化等特色,容易維護和開發,比起由一系列函數或指令組成的傳統的過程式編程(procedural programming),更適合多人合做的大型軟件項目。模塊化
1.3 面向對象的特色函數
-封裝
對於一些功能相同或者類似的代碼,咱們能夠放到一個函數中去,屢次用到此功能時,咱們只須要調用便可,無需屢次重寫。
創造對象的幾種模式:單例模式,工廠模式,構造函數模式,原型模式等。
繼承
子類能夠繼承父類的屬性和方法
var obj = { name: "Tom ", sex: " man", age:19, run:function(){ console.log("一天跑一千米"); } }
var obj = new Object(); obj.name = "Tom "; obj.sex = " man"; obj.age = 19; obj.run = function(){ console.log("一天跑一千米"); }
具備相同特性(數據元素)和行爲(功能)的對象的抽象就是類。所以,對象的抽象是類,類的具體化就是對象,也能夠說類的實例是對象,類實際上就是一種數據類型。類具備屬性,它是對象狀態的抽象,用數據結構來描述類的屬性。類具備操做,它是對象行爲的抽象,用操做名和實現該操做的方法來描述。
做爲初學者,容易混淆類和對象的概念。類(Class)是一個抽象的概念,對象則是類的具體實例。好比:人是一個類,司馬遷,李白,杜甫都是對象;首都是一個類,則北京,倫敦,華盛頓,莫斯科都是對象;動物貓是一個類,則Kitty、Grafield 和 Doraemon 都是對象。
咱們能夠說 Kitty 貓的體重是 1.5kg,而不能說貓類的體重是 1.5kg;能夠說李白是詩人,而不能說人類是詩人。狀態是描述具體對象而非描述類的,行爲是由具體對象發出的而非類發出的。
類與對象的關係就如模具和鑄件的關係,類實例化的結果就是對象,而對象的抽象就是類,類描述了一組有相同特性(屬性)和相同行爲的對象
class person{ }//這個是類 $obj = new person();//類的實例化就是對象
// Class 模板 function Person(name,sex,age){ var obj = {}; obj.name = name; obj.sex = sex; obj.age = age; obj.run = function(){ console.log("天天堅持跑步"); } return obj; } // 實例化 var person1 = Person("Tom","sex",19); //操做 person1.run(); // 輸出結果:天天堅持跑步
優勢:
一、 在工廠模式中,用戶只須要知道所要生產的具體東西,無須關心具體的建立過程,甚至不須要具體產品類的類名。
二、 在系統增長新的產品時,咱們只須要添加一個具體產品類和對應的實現工廠,無需對原工廠進行任何修改,很好地符合了「開閉原則」。
缺點:
一、 每次增長一個產品時,都須要增長一個具體類和對象實現工廠,使得系統中類的個數成倍增長,在必定程度上增長了系統的複雜度,同時也增長了系統具體類的依賴。這並非什麼好事。
//構造函數(這裏就建立了一個Class模板) function Person(name,sex,age){ this.name = name; this.sex = sex; this.age = age; this.run = function(){ console.log("天天堅持跑步"); } } // 實例化 ( new Object()) var person1 = new Person("Tom","man",19); //操做 person1.run();// 天天堅持跑步
// 構造全局的對象 var action = { run:function(){ console.log("天天堅持跑步"); } } //構造函數 funcction(name,sex,age){ this.name = name; this.sex = sex; this.age = age; this.run = action.run; } //實例化 var person1 = new Person("Tom","man",19); person1.run();
分析: 爲何要改進構造函數?
咱們都知道當實例化一個對象後,那麼這個對象就擁有了模板的屬性和方法,
當咱們使用方法時首先會在內存中開闢一份空間,而後在執行相應的操做。假設咱們實例化一萬個對象,那麼這一萬個對象在執行方法時都要在內存中開闢空間,這樣只會浪費內存的空間,這時若是能用一個操做代替一萬個操做那樣豈不是美哉,因此小編這裏用了一個全局的對象,即便是一萬個對象使用這個方法只會在內存中開闢一份空間。
可是這也有缺點,咱們都知道全局變量和局部變量,全局變量易形成污染而且聲明週期比較長,那麼全局對象也是同樣的,有沒有一種方式能夠不用所有對象呢?固然有,見下面的第三種建立模式
//構造函數 function Person(name,sex,age){ this.name = name; this.sex = sex; this.age = age; } //使用原型對象 Object.prototype Person.prototype.run = function() { console.log("天天堅持跑步"); } //實例化 var person1 = new Person("Tom","man",19); person1.run();// 天天堅持跑步
首先先明白幾個屬性:
__proto__: 對象的原型。全部對象都有(包括函數)
prototype:函數的原型對象。只有函數(準確來講是構造函數)纔有
constructor:對象上的一個屬性,默認指向這個原型的構造函數