1. 程式人生 > >javascript 原型 原型鏈 繼承

javascript 原型 原型鏈 繼承

  1. 每個函式物件都有一個prototype屬性,但普通物件沒有prototype屬性,prototype下面有一個constructor,指向這個函式

  2. 每個人物件有一個名為[[prototype]]的內部屬性,指向所對應的建構函式的原型物件,原型鏈基於__proto__

  3. Object Function 互相繼承對方,既是函式也是物件

  4. 屬性查詢

    在訪問物件的某個成員的時候會先在物件中找是否存在
    如果當前物件中沒有就在建構函式的原型物件中找
    如果原型物件中沒有找到就到原型物件的原型上找
    知道Object的原型物件的原型是null為止
    

    比如我們想要查詢例項foo原型上的屬性,首先先找它的原型屬性foo.proto

    ,即Foo.prototype。接著繼續向上查詢Foo.prototype.proto,即Object.prototype。繼續向上Object.prototype.proto,找到了null。查詢結束。

JavaScript instanceof 運算子程式碼

instanceof 運算子用於測試prototype屬性是否出現在物件原型鏈中的任何位置

function instance_of(L, R) {//L 表示左表示式,R 表示右表示式
	var O = R.prototype;// 取 R 的顯示原型
	L = L.__proto__;// 取 L 的隱式原型
 	while (true
) { if (L === null) return false; if (O === L)// 這裡重點:當 O 嚴格等於 L 時,返回 true return true; L = L.__proto__; } }

繼承

		// Car.prototype.constructor = Car
		// Car.__proto__ = Function.prototype
		// Function.__proto__ = Function.prototype
		// Object.__proto__ === Function.prototype
// Object.__proto__.__proto__ === Object.prototype // Object.prototype.__proto__ = null function Car(color) { this.color = color; } Car.prototype.go = function() { console.log(this.color) } function BMW(color) { Car.call(this, color); } // 可能會改變父類原型 // BMW.prototype = Car.prototype // call 和 new 會使Car的建構函式執行兩遍 // BMW.prototype = new Car() _proto = Object.create(Car.prototype); _proto.constructor = BMW; BMW.prototype = _proto; // 先繼承,在給原型上加BMW的方法 BMW.prototype.come = function() { console.log('come'); } var nss = new Car('blue'); // nss.__proto__ = Car.prototype var wss = new BMW('red'); console.dir(Car); console.dir(BMW); console.log('nss', nss); console.log('wss', wss);