一、基於原型的語言的特點
1 只有對象,沒有類;對象繼承對象,而不是類繼承類。
2 “原型對象”是基於原型語言的核心概念。原型對象是新對象的模板,它將自身的屬性共享給新對象。一個對象不但可以享有自己創建時和運行時定義的屬性,而且可以享有原型對象的屬性。
二、基於原型的語言中對象的創建
創建有兩個步驟
1. 使用"原型對象"作為"模板"生成新對象
這個步驟是必要的,這是每個對象出生的唯一方式。以原型為模板創建對象,這也是"原型"(prototype)的原意。
2. 初始化內部屬性
這一步驟不是必要的。通俗點說,就是,對"復制品"不滿意,我們可以"再加工",使之獲得不同於"模板"的"個性"。
三、原型,為復用代碼而生
四、繼承
五、小結
1.原型的本質就是對象引用原型對象的屬性,實現代碼復用。
2.基於原型的語言是以原型對象為模板創建對象。
js是世界上最容易被誤解的語言,原因主要有兩個:
1) 作為基於原型的語言中,卻連最基本的一個通過原型產生對象的函數都沒有,讓人不知道js根本上是以對象創建對象。
2) 使用new關鍵字創建對象,讓人誤會js是以類似java類的構造函數創建對象,實際上,構造函數在創建對象上起到次要的作用,甚至不需要,重要的只有函數的屬性prototype引用的原型對象,新對象以此為模板生成,生成之后才調用函數做初始化的操作,而初始化操作不是必要的。
記:js的面向對象是基於原型的面向對象,對象創建的方式根本上只有一種,就是以原型對象為模板創建對象,new function不是通過函數創建對象,只是刻意模仿java的表象。
七、從javascript的原型本質,理解javascript的構造器模式
1.理解js的使用(new關鍵字+函數)的創建對象方式,new func()。
function Admin(name){
this.name = name;
this.getName = function(){return this.name};
}
var admin= new Admin('Sn');
分析上面代碼。
javascript引入new關鍵字是為了模仿java創建對象的方式,通過語句var admin = new Admin('Sn') 就生成了一個admin對象。
我們知道,基於原型的語言生成一個步驟有兩步:
第一步是使用"原型對象"作為"模板"生成新對象,
第二步是初始化新對象的內部屬性。
我們敢肯定地推斷,javascript中的new Admin('Sn');必然做了這兩件事情,那么
1 "原型對象"在哪里?
2 怎么做到"初始化新對象的內部屬性"?
答案是,admin.prototype就是我們要找的"原型對象",通過"以新對象代替this,執行admin函數"做到了"初始化新對象的內部屬性"。
使用new+function的方式創建對象,其實就是應用我們設計的函數newInstance(實例化)時的思想;
function newInstance(constructor){
var obj = {};
obj.__proto__ = constructor.prototype;
constructor.call(obj,sliceArguments(arguments,1));
return obj;
}
八. javascript構造器模式的特點
1) javascript的頂層對象是Object.prototype
2) 所有對象有一個__proto__屬性。__proto__指向自己的"原型對象",搜索屬性的原型鏈以__proto__為基礎。
3) 每個函數都會默認關聯一個原型對象。javascript每創建一個函數的時候,都同時創建一個原型對象,賦值到函數的prototype屬性,用作使用new 生成實例對象的默認原型對象。該默認原型對象的內容是
{
__proto__:Object.prototype,
constructor: 指向函數本身
}
__proto__指向Object.prototype的目的是為了使生成的實例對象繼承頂層對象Object.prototype;
而constructor指向函數本身的目的是為了使生成的實例對象newObject可以直接通過newObject.constructor訪問到構造函數,同時構造函數和原型對象可以互相訪問也是個良好的設計。但是,實際上,constructor並沒有什么用,所以大家可以不理會這個屬性,這僅僅是一個優化的設計。
4) 可以修改或替換構造函數都會默認關聯的原型對象。
function A(){};
function B(){};
B.prototype = new A(); //原型對象為 new A()對象
B.prototype.constructor = A; //構造函數為A函數,可選
六、javascript對象繼承體系結構
1) 所有對象都有自己的原型對象。
2)所有構造函數的原型對象都是Function.prototype,Object.prototype是最頂層的對象。
3) 通過原型繼承,所有對象構成了一個完整的系統