首先上代碼
function fs () {
this.name = '哈哈'
fs.say = function () {
console.log('i am ' + this.name)
}
}
var cc = new fs()
console.log(cc)
console.log(cc.p)
cc.say()
image.png
這里我們首先創(chuàng)建了一個構(gòu)造函數(shù),配合上new關(guān)鍵字凫海,看看new到底做了啥
function fs () {
//1.創(chuàng)建一個新對象禁舷,賦予this拦键,這一步是隱性的谣光,
// let this = {};
//2.給this指向的對象賦予構(gòu)造屬性
this.name = '哈哈'
fs.say = function () {
console.log('i am ' + this.name)
}
//3.如果沒有手動返回對象,則默認(rèn)返回this指向的這個對象芬为,也是隱性的
// return this;
}
接下來再解釋一下上面執(zhí)行結(jié)果是為什么
console.log(cc) //輸出cc對象
console.log(cc.p) //cc并沒有p這個屬性所以undefined
cc.say() //cc也沒有say這個方法所以報錯萄金,say不是個函數(shù)
至于為什么,我們打開cc這個對象看看
image.png
可以看到媚朦,cc這個對象除了有一個name屬性之外氧敢,他的原型對象上并沒有任何其他東西了,我們都知道询张,js在訪問一個對象的屬性或者方法的時候孙乖,會沿著原型鏈一層一層的去找,也就是proto這個對象份氧,如果這個對象身上沒有唯袄,又會在proto對象的proto屬性身上去找,一直到最大的boss object身上蜗帜,如果都沒找到就會返回null越妈,返回null的原因也很簡單,因為大boss的原型指向的就是null
這里就涉及到了原型鏈和原型對象钮糖,原型對象也分為顯式原型對象和隱式原型對象
proto就是隱式原型對象 而還有一個prototype則是顯式原型對象
在js中萬物皆對象,函數(shù)其實也是個對象,只不過他比較特別店归,他不但有proto這個屬性阎抒,他還有一個prototype屬性
一個對象的proto其實是指向他的構(gòu)造函數(shù)的prototype原型的 接下來再看一個例子
function fs () {}
fs.prototype.p = 1
fs.prototype.say = function(){
console.log('i am' + this.p)
}
var cc = new fs()
console.log(cc)
console.log(cc.p)
cc.say()
image.png
這次我們在構(gòu)造函數(shù)的原型對象prototype上添加了一個屬性p=1 say=一個函數(shù)
這一次我們在打開cc這個對象的proto屬性可以看到,誒消痛!有p 還有say這個函數(shù)
所以打印的話也沒有問題且叁,正確的輸出了
image.png
至于這個constructor暫時還沒有搞明白是個咋回事,
cc的原型鏈?zhǔn)? proto --> fs.prototype --> object.proto