初學JavaScript的時候有人會認爲JavaScript不是一門面向對象的語言,由於JS是沒有類的概念的,可是這並不表明JavaScript沒有對象的存在,並且JavaScript也提供了其它的方式來解決面向對象的問題。因此JavaScript也是一門面向對象的語言。編程
面向對象僅僅是一個概念或者編程思想而已,它不該該依賴於某個語言存在。好比 PHP採用面向對象思想構造其語言,它實現了類、繼承、派生、多態、接口等機制。可是這些機制,只是實現面向對象編程的一種手段,而非必須。換言之,一門語言能夠根據其自身特性選擇合適的方式來實現面向對象。於是先入爲主地接受了"類"這個面向對象實現方式。函數
JavaScript不一樣於其它語言,它是經過原型(prototype)的方式來實現面向對象編程的,也就是說對象(object)是依靠構造器(constructor)利用原型(prototype)構造出來的,而有時也稱它爲僞類。post
下面說一下面向對象的實現方式,爲了好理解,咱們借鑑其它語言中類和對象的思想來簡單分析一下:學習
一:最簡單的面向對象(即便用JSON方式來聲明)this
定義一個僞類:spa
var Ren = { name:"張三", //至關於成員變量 sex:"男", //至關於成員變量 age:18, //至關於成員變量 say:function(){ //至關於成員方法 alert("講話"); } };
調用類裏面的成員:prototype
Ren.say();
經過上面的例子能夠看出來,該類裏面的成員至關於其它語言裏面的靜態成員,經過類名調用。
這種方式基本能夠知足開發的需求,可是相對於其它語言來講沒有實現封裝、繼承和多態,因此代碼的重用性比較差。code
二:使用原型的方式(函數構造器)對象
定義一個類:blog
function Ren(){ var name="張三"; //私有的成員變量 var sex ="男"; //私有的成員變量 this.PublicName="zhangsan", //公有的成員變量 this.setName = function(_name){ //成員方法 name=_name; } this.getName = function(){ //成員方法 return name; } }
造對象而且調用對象的成員:
var r = new Ren(); r.getName();
在建立對象的時候,會運行相似於這樣的代碼,使用構造器來建立對象:
this.prototype = {constructor: this}
函數的prototype的屬性的值被做爲原型對象來克隆出新對象。
雖然使用new運算符調用函數看起來像是使用模板實例化的方式來建立對象,但本質仍是以原型對象來克隆出新對象,目前咱們看它像是一個類,但還有一點就是每new Ren(),不但屬性產生副本,方法也會產生副本。
若是不想讓方法產生複本,它提供了prototype這個屬性,即原型。全部實例都會共享它裏面的屬性和方法。
能夠在定義對象的時候:把屬性放到定義裏,而把對象的方法放到原型裏!
以下:
function Ren(name, age) { this.name = "張三"; this.age = 18; }; Ren.prototype.say = function(){ //方法放在原型裏面 alert("hello"); };
調用該成員方法:
var r = new Ren(); r.say();
以上兩種方式均可以實現JavaScript中的面向對象,實際上每種語言的面向對象思想都是一致的,只是方法有所不一樣而已,在JavaScript這門強大的語言裏面依然是有面向對象存在的只是咱們學習了其它語言的面向對象以後,有種先入爲主的感受,對JavaScript的面向對象產生疑惑,因此必定謹記面向對象是一種思想,不是一種方法。
轉自李老師!