原型和原型鏈

建立對象有幾種方法

// 1.字面量
var o1 = {
    name: 'o1'
};
var o2 = new Object({
    name: 'o2'
});
// 2.Object.create()
var o3 = Object.create({
    name: 'o3'
});
// 3.構造函數
var M = function () {
    this.name = 'o3'
};
var o4 = new M();

image

原型、構造函數、實例、原型鏈的關係

image

幾點說明:函數

  • 函數聲明時自動增長prototype屬性,初始化一個空對象
  • 構造函數纔會有prototype,普通函數會有__proto__
  • 實例對象纔會有__proto__

繼承

工做原理:經過原型鏈的方式找到原型對象,原型對象的方法和屬性會共享;實例沒有的屬性會向上查找this

instanceof的原理

image

判斷原理:實例對象的__proto__屬性和構造函數的prototype屬性是否是引用同一個地址,並且實例對象的constructor必須指向對應構造函數spa

var a = [1, 2, 3];
alert(a instanceof Array);  //返回true
alert(a instanceof Object);  //返回true
 
alert(a.constructor == Array);  //返回true
alert(a.constructor == Object);  //返回false

constructor 更加精確地指向對象所屬的類,而對 instanceof 而言,即便是父類也會返回trueprototype

練習:如何判斷一個對象是否屬於某個類code

if(a instanceof Person){
    alert('yes');
}

new運算符(過程、工做原理)

1.建立一個空對象,而且this變量指向改對象,同時還繼承了該構造函數的原型
2.屬性和方法被加入到this引用的對象中去
3.最後隱式的返回this對象
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
相關文章
相關標籤/搜索