不用死記硬背,理解才是硬道理。只需要寫個例子,然后輸出看一下就清楚了
首先我們看下new Person輸出什么?
var Person = function(name, age) { this.name = name; this.age = age; }; Person.prototype.show = function() { console.log(this.name, this.age); }; var p = new Person("bella", 10); console.log(p);
有屬性name, age 和 __proto__
__proto__里面有原型方法show,constructor, __proto__
然后我們再輸出構造器Person.prototype:
對比一下,發現p的__proto__的值就是構造函數Person的prototype的屬性值。
因此new操作符創建對象可以分為以下四個步驟:
- 創建一個空對象
- 將所創建對象的__proto__屬性值設為構造函數的prototype的屬性值
- 執行構造函數中的代碼,構造函數中的this指向該對象
- 返回對象
因此上面的過程就可以等同於下面的過程:
var Person = function(name, age) { this.name = name; this.age = age; }; Person.prototype.show = function() { console.log(this.name, this.age); }; var p = {}; p.__proto__ = Person.prototype; Person.call(p, "balle", 10); // var p = new Person("bella", 10); console.log(p);