/* 原型:protopyte 我們新建的每一個函數(shù),解析器都會向函數(shù)中添加一個屬性propotype 如下: */ function Person(){} console.log(Person.prototype); /* 原型對象: 這個屬性對應著一個對象,這個對象就是我們所謂的原型對象 作用: 如果函數(shù)作為普通函數(shù)調(diào)用, prototype沒有任何作用 當函數(shù)以構(gòu)造函數(shù)的形式調(diào)用時,如下: */ function Person(){} let p1 = new Person(); // 它所創(chuàng)建的對象中都會有一個隱含的屬性, 指向該構(gòu)造函數(shù)的原型對象, 我們可以通過__proto__來訪問該對象 console.log(p1.__proto__); /* 原型對象就相當于一個公共的區(qū)域,所有同一個類的實例都可以訪問到這個原型對象 我們可以把 對象中 共有的內(nèi)容, 統(tǒng)一設置到原型對象中 如下: */ //向Person中添加一個屬性 Person.prototype.country = "中國"; console.log(p1.country); //并沒有在p1中設置,但卻有 //向Person中添加一個方法 Person.prototype.speak = function(){ console.log("我很棒!"); } p1.speak(); /* 當我們訪問對象一個屬性或方法時,它會先在對象自身中尋找,如果有,則直接使用,如果沒有,則會去原型對象中尋找,如果找到則直接使用 */ /* 總之: 我們創(chuàng)建構(gòu)造函數(shù)時,可以將這些對象共有的屬性和方法, 統(tǒng)一添加到構(gòu)造函數(shù)的原型對象中,這樣就不用分別為每一個對象添加, 也不會影響到全局作用域, 就可以使 每個對象都具有這些屬性和方法了 */