對於js新手來講,《JavaScript高級程序設計》的學習是必不可少的,這裏我總結了一下JavaScript難以理解的知識點,如今拿來在掘金分享一下吧bash
想要理解原型和原型鏈、prototype與__proto__,請先接受如下知識;函數
prototype(原型)學習
__proto__
複製代碼
constructor(構造函數)
複製代碼
// "構造函數建立對象"
function Person() {}
// var Person = function () {};
Person.prototype.name = "ziyin";
Person.prototype.myFunc = function () {
alert(this.name)
}
var person1 = new Person();
person1.myFunc();//"ziyin"
console.log(person1.__proto__ === Person.prototype)//true
console.log(Person.prototype.constructor) //function Person(){}(即構造器function Person)這裏是對象原型的constructor屬性
console.log(person1.constructor) //function Person(){}(即構造器function Person) 這裏是實例對象的constructor
複製代碼
// "對象字面量建立對象"
var Person = {};//等同於 var Person = new Object()
console.log(Person.__proto__ === Object.prototype)//true
console.log(Person.__proto__ === Person.constructor.prototype)//true
console.log(Person.constructor === Person.__proto__.constructor)//true
"此處等於號前面的constructor是實例對象的constructor,後面的是對象原型的constructor屬性"
console.log(Person.constructor)//function Object()
複製代碼
幾乎全部 JavaScript 中的對象都是位於原型鏈頂端的 Object 的實例
// "Object.create()建立對象"
var person1 = {name:"ziyin"};//等同於 var Person = new Object()
var person2 = Object.create(person1);
console.log(person2.constructor)// function Object()
console.log(person1.constructor)// function Object()
"console.log(person2.__proto__ === person1)// true console.log(person2.__proto__ === person2.constructor.prototype)// false __proto__失效"
console.log(person1.constructor === Object)// true
console.log(person1.__proto__ === Object.prototype)// true __proto__ 未失效
複製代碼
ECMAScript 中描述了原型鏈的概念,並將原型鏈做爲實現繼承的主要方法。其基本思想是利用原型讓一個引用類型繼承另外一個引用類型的屬性和方法。簡單回顧一下構造函數、原型和實例的關係:每一個構造函數都有一個原型對象,原型對象都包含一個指向構造函數的指針,而實例都包含一個指向原型對象的內部指針。那麼,假如咱們讓原型對象等於另外一個類型的實例,結果會怎麼樣呢?顯然,此時的原型對象將包含一個指向另外一個原型的指針,相應地,另外一個原型中也包含着一個指向另外一個構造函數的指針。假如另外一個原型又是另外一個類型的實例,那麼上述關係依然成立,如此層層遞進,就構成了實例與原型的鏈條。這就是所謂原型鏈的基本概念this
// 原型鏈
var Person = function () {} // function Person() {}
var person = new Person()
console.log(person.__proto__ === Person.prototype)//true
console.log(person.__proto__)//Object {} 這個是一個函數 constructor指向"Person()函數"
console.log(person.__proto__.__proto__)//Object 這裏是一個對象,constructor指向"Object()函數"
console.log(person.__proto__.__proto__.__proto__)//null
複製代碼
以上文章純屬我的看法,文中若有錯誤,歡迎評論區指正spa
但願看完本篇文章能對你理解JavaScript是基於原型的有所幫助!固然最重要的仍是理解了本文所說的prototype與__proto__、原型對象,若是本文幫助到了你,歡迎點贊關注!prototype
文章參考了《JavaScript高級程序設計(第三版)》、《你不知道的JavaScript上卷》、掘金做者水乙、"developer.mozilla.org/zh-CN/docs/…"設計