面向對象:面向對象、原型
對原型、原型鏈、 Function、Object 的理解
什麼是 JS 原型鏈?
轉載以上文章編程
面向對象編程(OOP)是一種基於「對象」概念的編程範式。該對象包含數據(屬性),以及一些執行過程的代碼(即方法)。對象的一個特性是,調用對象的方法過程能夠訪問並常常修改與其關聯的對象的數據字段(對象具備「this」或「self」的概念)。數組
把某個功能當作一個總體(對象),經過調用對象的某個方法來啓動功能。在用的時候不去考慮這個對象內部的實現細節,在去實現這個對象細節的時候不用管誰在調用瀏覽器
面向對象的寫法 Car.擰鑰匙() Car.掛擋() Car.踩油門()
經過new 函數名('參數,參數')獲得一個對象,就至關於這個對象就是這個函數構造出來的,這個對象是函數的實例函數
function Person(name) { this.name = name this.sayName = function() { console.log(this.name) } } var p = new Person('hunger')
instanceof是一個操做符,能夠判斷對象是否爲某個函數的實例this
p1 instanceof Person; // true p1 instanceof Object;// true
instanceof判斷的是對象,非對象的數據不能判斷spa
1 instanceof Number; // false
一、對函數使用new表達式就是構造函數prototype
二、每一個函數都有名稱爲prototype屬性,叫作原型,是一個對象code
三、每一個對象都有一個內部屬性 _proto_(規範中沒有指定這個名稱,可是瀏覽器都這麼實現的) 指向其類型的prototype屬性,類的實例也是對象,其__proto__屬性指向「類」的prototype對象
四、全部實例(對象)都會經過原型鏈引用到類型(函數)的prototype(原型),prototype至關於特定類型全部實例均可以訪問到的一個公共容器,通常用來共同調用的函數blog
總結:
咱們經過函數定義了類Person,類(函數)自動得到屬性prototype
每一個類的實例都會有一個內部屬性__proto__,指向類的prototype屬性
默認狀況下,我們寫構造函數是不須要return的,構造函數自動將this表明的對象返回出來!
但若是咱們寫了return語句,若是return是基本類型,會被認爲寫錯了無效。obj1和2仍是this表明的對象。若是return是對象,那構造的對象就等於return後面的對象。
//obj1={a:1,b:2} obj2={a:1,b:2}
全部數組都是由Array這個函數構建的。數組的全部方法都是Array.prototype或者他們的原型鏈上面的。當咱們直接賦值的方式生成一個數組的時候,就至關於直接用new Array的方法構建一個對象
Array函數也是由object函數構建的Array instanceof Object===true
數組能夠調用valueof這個方法,但valueof這個方法不在Array.protototype內而是在object.prototype內。
首先 a數組 會找本身的 valueof方法;沒有找到,就會沿着__proto__ 屬性繼續到構造函數 Array 的 prototype 裏找 valueof 方法;若是仍是沒有找到,再繼續往 Array.prototype 的 proto 即 Object.prototype 找 valueof 方法,最後找到 valueof 方法。
總結:一個對象調用其方法,先在本身的自由屬性內去找,找不到就去原型上去找,若是原型內也找不到,就到原型的原型上去找,直到找到該方法。而這構成的鏈就是原型鏈。以下圖
建議閱讀若愚老師這邊文章裏面的例子,鞏固印象對原型、原型鏈、 Function、Object 的理解