javascript 的繼承實例

 

shape.prototype = {
    getEdge:function(){
        return this.edge;
    },
    getArea:function(){
        return this.a*this.b;
    }
}
function shape(edge, a, b)
{
    this.edge = edge;
    this.a = a;
    this.b = b;
}

//三角形繼續形狀
triangle.prototype = new shape();
triangle.prototype.getName = function(){alert('I am a triangle');}
function triangle(bottom ,height)
{
    shape.call(this, 3, bottom ,height);
}


//四邊形繼續形狀
rectangle.prototype = new shape();
rectangle.prototype.getName = function(){alert('I am a rectangle');}
rectangle.prototype.getArea = function(){alert('I rewrite parent getArea method');}
function rectangle(bottom ,height)
{
    shape.call(this, 4, bottom ,height);
}

var t = new triangle(10, 5);

var r = new rectangle(10, 5);


console.dir(r);

 

繼承方面,javascript中的每一個對象都有一個內部私有的連接指向另外一個對象 (或者爲 null),這個對象就是原對象的原型. 這個原型也有本身的原型, 直到對象的原型爲null爲止. 這種一級一級的鏈結構就稱爲原型鏈.javascript

基於原型鏈的繼承html

javascript對象有兩種不一樣的屬性,一種是對象自身的屬性,另一種是繼承於原型鏈上的屬性.下面的代碼演示了當訪問一個對象的屬性時,到底發生了什麼java

 

// 假定咱們有個對象o,而且o所在的原型鏈以下:
// {a:1, b:2} ---> {b:3, c:4} ---> null
// 'a'和'b'是o自身的屬性.

// 該例中,用"對象.[[Prototype]]"來表示這個對象的原型.
// 這只是一個純粹的符號表示(ECMAScript標準中也這樣使用),不能在實際代碼中使用.

console.log(o.a); // 1
// a是o的自身屬性嗎?是的,該屬性的值爲1

console.log(o.b); // 2
// b是o的自身屬性嗎?是的,該屬性的值爲2
// o.[[Prototype]]上還有一個'b'屬性,可是它不會被訪問到.這種狀況稱爲"屬性遮蔽".

console.log(o.c); // 4
// c是o的自身屬性嗎?不是,那看看o.[[Prototype]]上有沒有.
// c是o.[[Prototype]]的自身屬性嗎?是的,該屬性的值爲4
console.log(o.d); // undefined
// d是o的自身屬性嗎?不是,那看看o.[[Prototype]]上有沒有.
// d是o.[[Prototype]]的自身屬性嗎?不是,那看看o.[[Prototype]].[[Prototype]]上有沒有.
// o.[[Prototype]].[[Prototype]]爲null,原型鏈已到頂端,沒有d屬性,返回undefined

 

在原型鏈上查找屬性比較耗時,對性能有反作用,這在性能要求苛刻的狀況下很重要。另外,試圖訪問不存在的屬性時會遍歷整個原型鏈。

 

更詳細的繼承介紹:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.htmlide

MDN繼承介紹:https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain性能

相關文章
相關標籤/搜索