[JS]繼承方式總結

來源:互聯網
上載者:User

標籤:nts   span   原型鏈   prot   參考   避免   issues   基礎   總結   

方式一:原型鏈繼承(prototype模式)
 
  1. function Animal(){
  2. this.species = "動物";
  3. }
  4. function Cat(name,color){
  5. this.name = name;
  6. this.color = color;
  7. }
  8. Cat.prototype = new Animal();//核心
  9. Cat.prototype.constructor = Cat;

缺點:
1.原型上的參考型別的屬性和方法被所有執行個體共用(個人覺得這不應該算缺點,畢竟原型就是派這個用處的)
2.建立Cat的執行個體時,無法向Animal傳參

方式二:經典繼承(建構函式綁定)
 
  1. function Animal(){
  2. this.species = "動物";
  3. }
  4. function Cat(name,color){
  5. Animal.call(this);//核心,或Animal.apply(this,arguments);
  6. this.name = name;
  7. this.color = color;
  8. }

優點:
1.避免了參考型別的屬性和方法被所有執行個體共用,因為根本沒用到原型嘛
2.建立Cat的執行個體時,可以向Animal傳參

缺點:
1.屬性和方法都在建構函式中定義,每次建立執行個體都會建立一遍屬性和方法

方式三:組合繼承(原型鏈繼承和經典繼承雙劍合璧)
 
  1. function Parent (name) {
  2. this.name = name;
  3. this.colors = [‘red‘, ‘blue‘, ‘green‘];
  4. }
  5. Parent.prototype.getName = function () {
  6. console.log(this.name)
  7. }
  8. function Child (name, age) {
  9. Parent.call(this, name);//核心
  10. this.age = age;
  11. }
  12. Child.prototype = new Parent();//核心
  13. var child1 = new Child(‘kevin‘, ‘18‘);
  14. child1.colors.push(‘black‘);
  15. console.log(child1.name); // kevin
  16. console.log(child1.age); // 18
  17. console.log(child1.colors); // ["red", "blue", "green", "black"]
  18. var child2 = new Child(‘daisy‘, ‘20‘);
  19. console.log(child2.name); // daisy
  20. console.log(child2.age); // 20
  21. console.log(child2.colors); // ["red", "blue", "green"]

優點:
1.融合原型鏈繼承和建構函式的優點融合原型鏈繼承和建構函式的優點

缺點:
1.兩次調用Parent建構函式,在Child.prototype上增加了額外、不需要的屬性,還破壞了原型鏈

方式四:寄生組合繼承
 
  1. function Parent (name) {
  2. this.name = name;
  3. this.colors = [‘red‘, ‘blue‘, ‘green‘];
  4. }
  5. Parent.prototype.getName = function () {
  6. console.log(this.name)
  7. }
  8. function Child (name, age) {
  9. Parent.call(this, name);//核心
  10. this.age = age;
  11. }
  12. Child.prototype = Object.create(Parent.prototype);//核心
  13. Child.prototype.constructor = Child;
  14. var child1 = new Child(‘kevin‘, ‘18‘);
  15. console.log(child1)

優點:在組合繼承的基礎上,避免了在 Child.prototype 上面建立不必要的、多餘的屬性。與此同時,原型鏈還能保持不變;因此,還能夠正常使用 instanceof 和 isPrototypeOf

參考連結:
https://github.com/mqyqingfeng/Blog/issues/16
http://www.ayqy.net/blog/%E9%87%8D%E6%96%B0%E7%90%86%E8%A7%A3js%E7%9A%846%E7%A7%8D%E7%BB%A7%E6%89%BF%E6%96%B9%E5%BC%8F/
http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html

[JS]繼承方式總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.