New和Prototype的相關理解

一直以來,javascript中面向對象的模式學了又忘,忘了又去學,沒有什麼進步,多是在對js面向對象模式相關知識的缺少。近來打算向前端方面發力,把學習的總結一下!javascript

首先從函數提及:前端

1.函數定義java

function test(){this.a="111"}函數

函數建立以後,會默認維護一個prototype屬性,也就是咱們日常說的原型對象。工具

這裏面原型對象維護了兩個屬性,constructor,和__proto__.學習

constructor這個是函數的構造函數,也就是函數的原始代碼.this

__proto__這個屬性很特別,保存建立源函數的prototype的實例,這個不太好理解,看一下下面函數建立,可能會理解的更好一些。spa

test.prototype.sysHello=function(){alert(this.a)}prototype

給函數原型擴展一個sysHello函數,看一下這個函數的原型,他的下面多了一個sysHello函數。code

2.經過new建立對象

var b=new test();

能夠看到函數test的實例b,有一個a屬性,但還存在一個__proto__屬性,其中和test.prototype屬性的值看起來是同樣,能夠驗證一下。

b.__proto__===test.prototype
true
在開發人員工具裏面,錄入上段代碼時,能夠看到他返回的是true,說明b.__proto__和test.prototype指導同一個實例。
這裏引用了 http://rockyuse.iteye.com/blog/1426522博客上說明解釋了一下,看到這裏應該知道他大概幹了什麼事了。
__proto__就是指向test.prototype,能夠再添加一個函數驗證一下
這裏能夠看到test.prototype屬性添加showA後,能夠看到b.__proto__也有了這個屬性,
那麼當咱們使用new建立一個新對象的時候,根據__proto__的特性,showA這個方法也能夠作新對象的方法被訪問到。因而咱們看到了:
構造子中,咱們來設置‘類’的成員變量(例如:例子中的id),構造子對象prototype中咱們來設置‘類’的公共方法。因而經過函數對象和Javascript特有的__proto__與prototype成員及new操做符,模擬出類和類實例化的效果。
3.經過prototype模擬繼承
function testExtend(){this.c="ccc"}
testExtend.prototype=new test();
新建一個testExtend函數,給testExtend.prototype屬性賦值new test()的實例
在這裏咱們能夠調用
d.showA();//alert("111");
這裏就能夠實現面向對象的模式。
相關文章
相關標籤/搜索