創建對象的幾種方式和new關鍵字背後的原理

一、創建對象的方式

     我總結了三種

1.使用字面量創建對象
  var obj1 = {a:1};
2.使用Object構造函數創建對象
  var obj2 = new Object({a:1});
3.使用構造函數創建對象
  function Foo(){
     this.a = 1
  };
  var obj3 = new FOO();
其實方法2和方法3是屬於同一種方式
4.使用Object.create()方法創建一個對象
  var obj4 = {a:1};
  var obj5 = Object.create(obj4);
通過Object.create方法創建的對象。
比如說方法4,obj5的原型就是obj4.

二、new關鍵字背後的原理

     這一塊我也不是很懂。

     簡而言之,就是說,

1.會創建一個新對象obj,繼承構造函數的prototype
2.執行構造函數,並將obj的上下文環境綁定
判斷構造函數的返回值,如果是一個對象,則返回該對象,如果不是,返回obj。
var new = function(fn){
   var obj = {};
   obj.__proto__ = fn.prototype;
   var res = fn.call(obj);
   return typeof res === 'object'?res:obj;
}

通過new運算符的原理,我們知道了,

function fn(){
   ...
}
var obj = new fn();
如果fn函數return了一個新對象,那麼這個新對象就會賦值給obj,而且該對象的原型鏈就會直接指向了Object.prototype;不是fn.prototype


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章