-
在面向對象編程中,類和對象可想象爲鑄模和鑄件地關係,對象總是從類中創建。
-
在原型編程地思想中,類不是必須的,對象也不一定從類中創建。對象是通過克隆另一個對象得到的,如果需要一個和某對象一摸一樣的對象,就可以用原型模式
-
Object.create可以用來克隆對象
var Plane = function(){ this.blood = 100; this.attackLevel = 1; this.defenseLevel = 1; }; var plane = new Plane(); plane.blood = 500; plane.attackLevel = 10; plane.defenseLevel = 7; var clonePlane = Object.create( plane ); console.log( clonePlane ); // 輸出:Object {blood: 500, attackLevel: 10, defenseLevel: 7}
在不支持 Object.create 方法的瀏覽器中,則可以使用以下代碼:
Object.create = Object.create || function( obj ){ var F = function(){}; F.prototype = obj; return new F(); }
-
克隆是創建對象的手段
原型鏈
假設有一原型鏈 : Object=>Animal=>Dog
當我們嘗試調用Dog對象的方法,而它本身卻沒有這個方法時,那麼這個對象會把這個請求委託給它的原型Animal,並順着原型鏈委託下去,直至找到該方法或者到達根對象。
JavaScript中的原型繼承
-
按照 JavaScript 設計者的本意,除了 undefined 之外,一切都應是對象。爲了實現這一目標,number、boolean、string 這幾種基本類型數據也可以過“包裝類”的方式成對象類型數據來處理。
-
js中的根對象是Object.prototype空對象。
-
js中的函數既可以當作普通函數使用,也可以作爲構造器調用。當使用new運算符調用函數時,這個函數就是構造器
-
就js的真正實現,並不能說對象有原型,而只能說對象的構造器有原型,對象把請求委託給它的構造器的原型。
-
js給對象提供了一個命爲proto隱藏對象,proto指向構造器的原型對象,{Constrctor}.prototype
-
手動給新建對象設置正確得 __ proto __ 指向可使用
obj.__proto__ = Constructor.prototype
-
js的對象最初都是由Object.prototype對象克隆而來,但是對象構造器的原型可以動態指向其他對象,從而達到繼承的效果。
-
實現一個”類“繼承另一個類的效果
var A = function(){} A.prototype = {name:'sven'} var B = function(){} B.prototype = new A() var b = new B() console.log(b.name)
- 嘗試遍歷b的所有屬性,沒有找到name
- 將請求委託給b的構造器的原型,它通過b.__ proto __ 指向 B.prototype,B的原型是一個由A構造器創造出來的對象
- 在B的原型中依然沒有找到name屬性,於是將請求委託給new A()對象的構造器原型 A.prototype
- 在A.prototype中找到name屬性,並返回他的值
-
繼承總是發生在對象與對象之間
-
Object.prototye的原型是null,當請求委託到此卻沒與找到相應屬性時,返回undefined
-
設計模式是對語言不足的補充
-
通過設置構造器原型來實現原型繼承時,初根對象Object.prototype本身外,任何對象都會有一個原型。而通過Object.create(null)可以創建出沒有原型的對象。(Object.create創建對象的效率不高)
-
Es6的class語法,其背後仍是通過原型機制創建對象。