所有prototype 鏈的頂端都是 object.prototype!!!
1. 問題: f 是否有 a b c方法
var f = function () ;
object.prototype.a = function () ;
f.prototype.b = function () ;
function.prototype.c = function () ;
var f = new f();
f.a(), f.b(); // b 是它直接原型鏈上面的方法, a是它原型鏈頂端 object.prototype 上面的方法, c 是function.prototype上面的方法,和它沒有任何關係
console.log(f.constructor.b === f.prototype.b); // f.constrcutor 是 f, f.b 因為沒有這個b屬性,所以去它的原型鏈function.prototype 去找,function.prototype 上面沒有發現b,所 結果: false
console.log(f.constructor.prototype.b === f.prototype.b); // f.constructor 是 f, f.prototype.b === f.prototype.b 一樣的 結果: true
// f.constructor.c === function.prototype.c; // f是乙個建構函式, f的直接prototype 是 function.prototype, 所以這裡的c也是拿的function.prototype.c, 結果: true
console.log(f.constructor.a === object.prototype.a); // f.constrcutor 是 f, f的直接prototype 鏈是 function.prototype, 但是function.prototype 沒有這個a屬性,於是繼續向上查詢,這裡查詢到了prototype鏈的頂端: object.prototype, 然後 object.prototype 上面有a屬性,所以這裡拿的就是 object.prototype 上面的a屬性, 結果: true
// !!! 需要注意: f.b f沒有這個屬性,只是會沿著 [[prototoye]] 鏈去找,也就是 f.__ proto__ __ 指向的prototype, f.__proto__ === function.prototype, 而不是自己去f.prototype 上面去找,大家一定要記住了
console.log(f.constructor.__proto__ === function.prototype, function.prototype.__proto__ === object.prototype); //結果: true 原因的話,大家可以參考我上面的解釋
2.
function a()
function b(a) ;
// this.a = undefined 因為沒有傳a進來,因為它自己存在a屬性,發生了遮蔽,不會去prototype上面去找
this.a = a;
// return this;
}function c(a) ;
if (a)
}a.prototype.a = 1;
b.prototype.a = 1;
c.prototype.a = 1;
console.log(new a().a); // 1
console.log(new b().a); // undefined 參考b 裡面我寫的解釋。
console.log(new c(2).a); // 2
3.
var f = function () ; // f.prototype.__proto__ === function.prototype
object.prototype.a = function () ;
function.prototype.b = function () ;
var f = new f();
f.a(); // a()
f.b(); // b()
f.a(); // a()
f.b(); // 報錯 f 是乙個物件, f.__proto__ === f.prototype, f.prototype.__proto__ === object.prototype, 完全不關 function.prototype 什麼事情,object.prototype上面並沒有b方法,所以報錯了
4.
// 考點: 屬性遮蔽,原始值與引用值
function a()
function b()
b.prototype = new a(); //
var b1 = new b()
var b2 = new b()
b1.name = 'change'; // 因為它自己並沒有這個屬性,它改的是它的prototype上面的,改了之後,這是乙個原始值,發生遮蔽行為,自己把這個屬性偷了
b1.color.push('black') // 引用值,首先,b1 是根本沒有color這個屬性的,它之所以能夠訪問 b1.color,完全是因為 它的prototype上面有這個屬性,所以,它是直接返回了它prototype上面的值,color是prototype上面的乙個引用值,它這裡儲存的是color在prototype裡面的位址,b1 對這個color進行修改,prototype裡面也一起改了
console.log(b1); // b 修改了,發生了遮蔽
console.log(b2); // b {}; b2 上面沒有任何屬性,全是prototype 上面的,
console.log(b1.name); // change
console.log(b2.name); // a
console.log(b1.color); // [g, y, b]
console.log(b2.color); // [g, y, b] b2 也沒有color這個屬性,沿著prototype上面的去找,prototype上面的color已經是 [g, y, b]了
JS 物件 JS原型 原型鏈
參考學習 js物件 構造器函式 建立物件的函式。物件分為普通物件和函式物件。所有物件都有 proto 屬性 函式物件不止有 proto 屬性,還有prototype屬性 稱為原型物件 1.new function 產生的物件都是函式物件。2.所有函式物件的 proto 都指向function.pro...
js 原型與原型鏈
5條原型規則 1.所有的引用型別 陣列 物件 函式 都具有物件特性,即可自由擴充套件屬性 除了 null 除外 2.所有的引用型別 陣列 物件 函式 都有乙個 proto 隱式原型 屬性,屬性值是乙個普通的物件。3.所有的函式,都有乙個prototype 顯式原型 屬性,屬性值也是乙個普通的物件。4...
JS原型物件,原型鏈
js中建立物件都是通過建構函式建立的,所以每個物件中都有乙個指向其建構函式的指標constructor var obj new object var arr new array var obj2 字面量建立實質上是上面方式的簡寫 var arr2 var str new string test 建立...