Ⅰ js中繼承怎麼理解,為什麼要用js繼承
js中繼承跟java中的繼承不太一樣,一般通過call()和apply()兩種方式完成,js中的繼承是以復制的形式完成的,復制一個父對象,而不像java中直接繼承父對象,還有通過原型的方式完成繼承,也有弊端,總之js中的繼承只是形式上的對面向對象語言的一種模仿,本質上不是繼承,但用起來效果是一樣的
至於為什麼要繼承:通常在一般的項目里不需要,因為應用簡單,但你要用純js做一些復雜的工具或框架系統就要用到了,比如webgis、或者js框架如jquery、ext什麼的,不然一個幾千行代碼的框架不用繼承得寫幾萬行,甚至還無法維護
Ⅱ js裡面的繼承該怎麼理解,原型鏈是什麼概念,這方面的內容很重要麼
先來看一下原型
JavaScript的所有function類型的對象都有一個prototype屬性,這個prototype屬性本身
是一個object類型的對象,因此我們也可以給這個prototype對象添加任意的屬性和方法。
先看以下代碼
<script type=」text/javascript」>
Person = function(){
this.name = 「jack」;
};
Person.prototype.name = 「rose」;
p = new Person();
alert(p.name);//輸出jack
delete p.name;
alert(p.name);//輸出rose
</script>
由此可見當我們調用p.name時首先到p對象內部去查找name屬性如果沒有就去p對象的原型(prototype)中去查找name屬性再來看以下代碼
<script type=」text/javascript」>
Person = function(){
this.name = "jack";
};
Employee = function(){
this.name = "emp";
};
1 Employee.prototype = new Person();
2 Employee.prototype.name = "protoName";
Person.prototype.name = "rose";
e = new Employee();
alert(e.name);//輸出emp
delete e.name;
alert(e.name);//輸出protoName
delete Employee.prototype.name;
alert(e.name);//輸出rose
</script>
上面這段代碼可以看出調用e.name 首先到e對象內部查找可以找到emp,刪除後然後到e對象的原型中(prototype)去查找name屬性此時找到protoName再刪除,此時發現程序執行的流程是到Person的原型中去找出了rose, 由此可見代碼行1中Employee的原型關聯到了Person,相當於Person是Employee的父類。
讀者可能會發現上面這段描述寫的很敷衍
為什麼順序不是這樣
e對象內部->e對象原型->person對象內部->person對象原型
而是
e對象內部->e對象原型-> person對象原型
其實關鍵就在於1、2兩行代碼
做個實驗
調換1、2兩行代碼的位置
即
2 Employee.prototype.name = "protoName";
1 Employee.prototype = new Person();
再運行看看結果
alert(e.name);//輸出emp
delete e.name;
alert(e.name);//輸出jack
delete Employee.prototype.name;
alert(e.name);//輸出rose
</script>
這種輸出結果就好像如下順序
e對象內部-> person對象內部->person對象原型
如果你是真心想學習JS、以後想朝著這個方向發展,那麼你一定要來這個企鵝裙,前面前面是2九六,中間是五九一,最後面就是2九零,連起來就是完整的了,來這里可以這里學習經驗,得到專人解答,這樣你可以成長的更快!!!
為什麼有這樣的區別,關鍵就是這句話
Employee.prototype = new Person(); Employee的原型對象被賦值成了一個Person對象即Employee的原型被修改了,那麼寫在這句前面的Employee.prototype.name ="protoName";就沒有用了和刪除這句話效果一樣
那麼Employee.prototype.name也就理所應當等於person對象的name 給Employee.prototype.name賦值也就相當於給person對象的name屬性賦值那麼原來的jack就被覆蓋了原型鏈就是prototype對象的一條關系鏈這條鏈的末端就是Object對象的原型當調用對象的屬性或方法時首先會去對象內部查找,然後再依次順著原型鏈條一直找到Object