2 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
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對象

TA貢獻1833條經(jīng)驗 獲得超4個贊
p.__proto__這個是原型的意思
1.
function Boo() {}
function Foo() {}
Foo.prototype = new Boo; //這里你修改了Foo的原型為Boo,所以下面打印出的是Boo
p=new Foo;
console.log(p.__proto__); //這里為什么輸出的是Boo{}呢?不是應該輸出Foo{}嗎,另外p.__proto__.p.__proto__輸出的也是Foo{}
2.
function Foo() {}
p=new Foo;
console.log(p.__proto__);
這里輸出的是Foo{}
p是Foo的對象,又沒有修改過原型,當然是Foo了
添加回答
舉報