面向過程和麪向對象都是編程的思想, 方式不同
面向過程: 凡事都是親力親爲, 全部的代碼都要本身寫, 每一步都要很清楚, 注重的是過程
面向對象: 執行者成爲指揮者, 只要找對象, 而後讓對象作相關的事情, 注重的是結果
面向對象的特性: 封裝, 繼承, 多態
封裝;就是代碼的封裝, 把一些特徵和行爲封裝在對象中
面向對象的編程思想: 根據需求, 抽象出相關的對象, 總結對象的特徵和行爲, 把特徵變成屬性,行爲變成方法, 而後定義(js)構造函數, 實例化對象, 經過對象調用屬性和方法, 完成相應的需求.---編程的思想
對象: 具體特指的某個事物, 有特徵(屬性)和行爲(方法),對象能夠當作是一坨無序屬性的集合
如何建立對象?
經過調用new Object(), 還有{}, 自定義構造函數
建立對象的方式
1. 調用系統Object()----->建立出來的對象都是Object類型的, 不能很明確的指出這個對象是屬於什麼類型
2. 字面量的方式{}----->只能建立一個對象(一次只能建立一個)
3.工廠模式建立對象----->----->推論---->自定義構造函數的方式
自定義構造函數(優化後的工廠模式)
自定義構造函數建立對象: 4件事
1.在內存中申請一塊空閒的空間, 存儲建立的對象
2.this就是當前實例化的對象
3.設置對象中的屬性和方法(爲對象添加屬性和方法,爲屬性和方法賦值)
4.把建立後的對象返回
都是須要經過new的方式
什麼是原型?
構造函數中有一個屬性prototype, 是原型, 程序員使用的
實例對象中有一個屬性__proto__, 是原型, 瀏覽器使用的, 不是很標準的,
實例對象中的__proto__指向的就是該實例對象中的構造函數中的prototype
構造函數中的prototype裏面的屬性或者方法,能夠直接經過實例對象調用
正常的寫法: 實例對象.__proto__才能訪問到構造函數中的prototype中的屬性或者方法
per.__proto__.eat();//__proto__不是標準的屬性
per.eat();
原型就是屬性, 而這個屬性也是一個對象
Person.prototype--->是屬性
Person.prototype.屬性或者Person.ptototype.方法()
自己在構造函數中定義的屬性和方法, 當實例化對象的時候, 實例對象中的屬性和方法都是在本身的空間中存在的, 若是是多個對象。
這些屬性和方法都會在單獨的空間中存在,浪費內存空間, 因此, 爲了數據共享, 把想要節省空間的屬性或者方法寫在原型對象中,達到了數據共享,實現了節點內存空間
原型的做用之一: 數據共享,節省內存空間
原型的寫法:
構造函數.prototype.屬性=值
構造函數.prototype.方法=值---->函數.prototype,函數也是對象,因此,裏面也有__proto__
實例對象.prototype-------->實例對象中沒有這個屬性,只有__proto__(暫時的)
簡單的原型的寫法
缺陷: --->新的知識點---->原型直接指向{}---->就是一個對象, 沒有構造器
構造函數.prototype={
切記: 若是這這種寫法, 要把構造器加上
};
經過原型爲內置對象添加原型的屬性或者方法----->緣由:
系統的內置對象的屬性和方法可能不知足如今需求, 因此, 能夠經過原型的方式加入屬性或者方法, 爲了方便開發
爲內置對象的原型中添加屬性和方法, 那麼這個內置對象的實例對象就能夠直接使用了
String.prototype.方法=匿名函數;
var str="哈哈";
str.方法();---->實例對象能夠直接調用原型中的屬性或者方法