一、創建對象的方式
我總結了三種
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