【javascript基礎】六、new與構造函數

前言

上篇說建立對象的時候提到了帶返回值的構造函數,那裏沒有和你們說這個問題,今天就和你們一塊兒學習構造函數和new操做符。我也是最近才稍微弄明白點這個構造函數,之前老是忽略一些問題,如今就是想到哪塊不行,就研究下,查查資料,本身搗鼓搗鼓,但願你們也隨手記一下本身忽然想起的哪塊不熟悉知識點。javascript

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

構造函數與new

啥時構造函數,我一時也說不明白,我知道在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的一會說。學習

new的過程

表面看起來是一個簡單的過程,實際上是一個蠻複雜的流程: this

  1. 建立一個空對象。
  2. 設置這個對象的原型,就是指定__proto__的指向
  3. 將構造函數的做用域賦給新對象(所以this就指向了新對象)
  4. 執行構造函數中的代碼(給這個新對象添加方法和屬性)
  5. 返回這個對象(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:祝有對象的道友,情人節快樂!暫無對象的道友,元宵節快樂!

相關文章
相關標籤/搜索