javascript基於原型的語言的特點


一、基於原型的語言的特點

 

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) 通過原型繼承,所有對象構成了一個完整的系統

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM