上篇說建立對象的時候提到了帶返回值的構造函數,那裏沒有和你們說這個問題,今天就和你們一塊兒學習構造函數和new操做符。我也是最近才稍微弄明白點這個構造函數,之前老是忽略一些問題,如今就是想到哪塊不行,就研究下,查查資料,本身搗鼓搗鼓,但願你們也隨手記一下本身忽然想起的哪塊不熟悉知識點。javascript
JavaScript 是面向對象的語言,可是他的面向對象不是基於類的,是基於原型的。javascript中沒有是類,任何所謂的類都是咱們模擬的,其中一種方法就是經過構造函數來模擬類。在面向對象編程中,類(class)是對象(object)的模板,定義了同一組對象(又稱"實例")共有的屬性和方法。Javascript語言不支持"類",可是能夠用一些變通的方法,模擬出"類"。html
function Dog() { this.name = "旺財"; }
//建立一個對象 var dog = new Dog();
你們能夠看一些這篇文章http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.htmljava
啥時構造函數,我一時也說不明白,我知道在javascript中構造函數是建立自定義類型的,像Array,String等這些是原生的類型,這些是原來就有的,咱們能夠直接使用這些類型建立對象,假如你想要建立一個新的自定義類型,好比類型Person,沒辦法了使用原生的類型,須要自定義了。構造函數是一種特殊的方法,主要用來在建立對象時初始化對象,即爲對象成員變量賦初始值,總與new運算符一塊兒使用在建立對象的語句中。編程
構造函數也是函數,只不過是一個特殊的函數,之因此叫構造函數是由於和new放在了一塊兒,不和new一塊兒使用他就是一個普通的函數。數組
function Person(name){ this.name = name; } //普通函數 Person("hainan"); console.log(window.name);//hainan //構造函數 var person = new Person("Allenxing"); console.log(person.name);//Allenxing
估計你們看明白了,構造函數和普通函數沒有什麼區別,普通函數和new一塊兒使用,那麼普通函數也能夠叫構造函數,記住在new後面的就叫構造函數。函數
咱們用一個普通的函數new出來了一個對象,如何new的一會說。學習
表面看起來是一個簡單的過程,實際上是一個蠻複雜的流程: this
這個是默認的流程,是最簡單的流程,通常咱們new一個對象的時候這些都是看不到的,咱們知道獲得最後的結果,如今咱們能夠模擬一些這個流程,一步一步來就能夠了spa
function Person(name){ var obj = new Object();//新建對象 obj.name = name;//賦值屬性 obj.__proto__ = Person.prototype;//指定對象中的指針 return obj;//返回對象 } Person.prototype.getName = function(){ console.log(this.name); } var person = new Person("hainan"); person.getName();
看看咱們的結果prototype
就是這樣子了,和原來new出來的同樣,哦了。
這個是默認的構造函數,是沒有返回值的構造函數,要是咱們的構造函數有返回值了,那麼結果會是什麼樣的呢?看一個例子
function Person(name){ this.name = name; var obj = new Object(); obj.name = "Allenxing"; return obj; } var person = new Person("hainan"); console.log(person.name);//Allenxing
看出來了吧,返回的是return 以後的值,而不是默認的this,那是否是返回全部的值會都覆蓋原來的this對象呢?瞧瞧看
function Person(name){ this.name = name; return "Allenxing"; } var person = new Person("hainan"); console.log(person.name);//hainan
顯然不是這樣的,這個例子並無覆蓋返回原來的this對象。
總結一下,若是構造函數中返回的是一個對象,數組,那麼就會覆蓋返回原來的this對象,若是不是對象和數組,即便是undefined,null和 空 都是返回this對象。你們能夠試試看,咱試兩個看看
function Person(name){ this.name = name; return new String("Allenxing");//對象 } var person = new Person("hainan"); console.log(person.name);//undefined
function Person(name){ this.name = name; return undefined; } var person = new Person("hainan"); console.log(person.name);//hainan
這裏就不在實驗了,有興趣你們試一下。
今天和你們說了一下new和構造函數,只有new以後的函數才叫構造函數,不然都是普通函數,固然這都是概念,不用太較真,只要懂原理了愛叫什麼叫什麼。有啥問題請你們指正。
PS:祝有對象的道友,情人節快樂!暫無對象的道友,元宵節快樂!