function ClassA() {
}
ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
alert(this.color);
};
function ClassB() {
}
ClassB.prototype = new ClassA();
原型方式的神奇之處在於最後一行程式碼。這裡,把 ClassB 的 prototype 屬性設定成 ClassA 的實例。這很有意思,因為想要 ClassA 的所有屬性和方法,但又不想逐一將它們 新增到ClassB 的 prototype 屬性。還有比把 ClassA 的實例賦予 prototype 屬性更好的方法嗎?
與物件冒充相似,子類別的所有屬性和方法都必須出現在 prototype 屬性被賦值後,因為在它之前賦值的所有方法都會被刪除。為什麼?因為 prototype 屬性被替換成了新對象,所以添加了新方法的原始物件將被銷毀。所以,為ClassB 類別加入name 屬性和sayName() 方法的程式碼如下:
程式碼如下:
程式碼如下:
function ClassB() {
}
複製程式碼 程式碼如下: console.log(objB.__proto__===objB.constructor.prototype) //false因為ClassB的原型鏈prototype 屬性被另一個類別的物件重寫了。輸出結果可以看出objB.__proto__仍然指向的是ClassB.prototype,而不是objB.constructor.prototype。這也很好理解,給Person.prototype賦值的是一個物件直接量new ClassA()實例,使用物件直接量方式定義的物件其建構器(constructor)指向的是根構造器Object,Object.prototype是一個空物件{},{}自然與ClassB.prototype不等。