1 回答

TA貢獻1859條經驗 獲得超6個贊
每個函數(shù)就是一個對象(Function),函數(shù)對象都有一個子對象 prototype對象,類是以函數(shù)的形式來定義的。prototype表示該函數(shù)的原型,也表示一個類的成員的集合。
也就是說prototype 是原型,是Function對象才有的屬性,原型主要是用來實現(xiàn)繼承,從而用js 進行面向對象編程
如 Foo 是一個Function對象,是有prototype屬性的 ,它指向一個Boo 的實例對象
而p 是一個 Foo 的實例對象,不是一個Function 對象,沒有prototype 屬性,但是p有一個私有屬性__proto__ 這個屬性,一般不直接訪問的,事實上這個屬性就是 Foo.prototype
在chrome控制臺中測試
console.log(p.__proto__ == Foo.prototype)
VM952:2 true
console.log(p.__proto__ === Foo.prototype)
VM956:2 true
上述測試都輸出true,說明他們確實是同一個東西js的繼承是通過原型繼承的,有個原型鏈的概念,而原型鏈就是通過__proto__屬性實現(xiàn)的
function Boo() {this.x="test in Boo";}
function Foo() {this.y = "test in Foo"}
Foo.prototype = new Boo;
p=new Foo;
console.log(p.y);//test in Foo
console.log(p.x);//test in Boo
Foo 中并沒有屬性x,當p找不到屬性x時,就到p.__proto__屬性(指向原型)中找,原型中是有x屬性的,于是輸出x的值如果不考慮內部實現(xiàn),就好像屬性x是從Boo中繼承的一樣
console.log(p.__proto__); 輸出 Boo{}表示一個空的Boo對象(通過 new Boo 創(chuàng)建的 )
p.__proto__.p.__proto__這個會報錯,因為p.__proto__中沒有名為p的屬性
function Foo() {}
p=new Foo;
console.log(p.__proto__);
因為沒有改變Foo.prototype 的屬性,所以仍然指向它自己(Foo)
而 p.__proto__ 就是 Foo.prototype 所有輸出Foo{} 表示一個空的Foo對象。
添加回答
舉報