javascript 原型 原型鏈 繼承
阿新 • • 發佈:2018-12-13
-
每個函式物件都有一個prototype屬性,但普通物件沒有prototype屬性,prototype下面有一個constructor,指向這個函式
-
每個人物件有一個名為[[prototype]]的內部屬性,指向所對應的建構函式的原型物件,原型鏈基於
__proto__
-
Object Function 互相繼承對方,既是函式也是物件
-
屬性查詢
在訪問物件的某個成員的時候會先在物件中找是否存在 如果當前物件中沒有就在建構函式的原型物件中找 如果原型物件中沒有找到就到原型物件的原型上找 知道Object的原型物件的原型是null為止
比如我們想要查詢例項foo原型上的屬性,首先先找它的原型屬性foo.proto
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);