成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Javascript面向對象編程(二)繼承

開發 前端
Javascript是一種基于對象(object-based)的語言,你遇到的所有東西幾乎都是對象。但是,它又不是一種真正的面向對象編程語言,因為它的語法中沒有class。本文主要介紹Javascript中的繼承,一起來看。

上一次的文章,主要介紹了Javascript如何"封裝"數據和方法,從原型對象生成實例。今天要介紹的是,多個原型對象之間如何"繼承"。

比如,現在有一個"動物"對象,

 

  1. function Animal()  
  2. {  
  3. this.species = "動物";  

 

還有一個"貓"對象,

 

  1. function Cat(name,color)  
  2. {  
  3. this.name = name;  
  4. this.color = color;  

 

怎樣才能使"貓"繼承"動物"呢?

1. 原型對象綁定

最簡單的方法,大概就是使用call或apply方法,將父對象綁定在子對象上,也就是在子對象函數中加一行:

 

  1. function Cat(name,color)  
  2. {  
  3. Animal.apply(this, arguments);  
  4. this.name = name;  
  5. this.color = color;  
  6. }   
  7. var cat1 = new Cat("大毛","黃色");  
  8. alert(cat1.species); // 動物 

 

2. prototype模式

更常見的做法,則是使用prototype屬性。

如果"貓"的prototype對象,指向一個Animal的實例,那么所有"貓"的實例,就能繼承Animal了。

 

  1. Cat.prototype = new Animal();  
  2. Cat.prototype.constructor = Cat;  
  3. var cat1 = new Cat("大毛","黃色");  
  4. alert(cat1.species); // 動物 

 

代碼的第一行,我們將Cat的prototype對象指向一個Animal的實例。

 

  1. Cat.prototype = new Animal(); 

 

它相當于完全刪除了prototype 對象原先的值,然后賦予一個新值。但是,第二行又是什么意思呢?

 

  1. Cat.prototype.constructor = Cat; 

 

原來,任何一個prototype對象都有一個constructor屬性,指向它的構造函數。也就是說,Cat.prototype 這個對象的constructor屬性,是指向Cat的。

我們在前一步已經刪除了這個prototype對象原來的值,所以新的prototype對象沒有constructor屬性,所以我們必須手動加上去,否則后面的"繼承鏈"會出問題。這就是第二行的意思。

總之,這是很重要的一點,編程中務必要遵守。下文都遵循這一點,即如果替換了prototype對象,

 

  1. o.prototype = {}; 

 

那么,下一步必然是為新的prototype對象加上constructor屬性,并將這個屬性指回原來的構造函數。

 

  1. o.prototype.constructor = o; 

 

3. 直接繼承prototype

由于Animal對象中,不變的屬性都可以直接寫入Animal.prototype。所以,我們也可以讓Cat()跳過 Animal(),直接繼承Animal.prototype。

現在,我們先將Animal對象改寫:

 

  1. function Animal(){ }  
  2. Animal.prototype.species = "動物"

 

然后,將Cat的prototype對象,然后指向Animal的prototype對象,這樣就完成了繼承。

 

  1. Cat.prototype = Animal.prototype;  
  2. Cat.prototype.constructor = Cat;  
  3. var cat1 = new Cat("大毛","黃色");  
  4. alert(cat1.species); // 動物 

 

與前一種方法相比,這樣做的優點是效率比較高(不用執行和建立Animal的實例了),比較省內存。缺點是 Cat.prototype和Animal.prototype現在指向了同一個對象,那么任何對Cat.prototype的修改,都會反映到Animal.prototype。

所以,上面這一段代碼其實是有問題的。請看第二行

 

  1. Cat.prototype.constructor = Cat; 

 

這一句實際上把Animal.prototype對象的constructor屬性也改掉了!

 

  1. alert(Animal.prototype.constructor); // Cat 

 

4. 利用空對象作為中介

由于"直接繼承prototype"存在上述的缺點,所以可以利用一個空對象作為中介。

 

  1. var F = function(){};  
  2. F.prototype = Animal.prototype;  
  3. Cat.prototype = new F();  
  4. Cat.prototype.constructor = Cat; 

 

F是空對象,所以幾乎不占內存。這時,修改Cat的prototype對象,就不會影響到Animal的prototype對象。

 

  1. alert(Animal.prototype.constructor); // Animal 

 

5. prototype模式的封裝函數

我們將上面的方法,封裝成一個函數,便于使用。

 

  1. function extend(Child, Parent)   
  2. {  
  3. var F = function(){};  
  4. F.prototype = Parent.prototype;  
  5. Child.prototype = new F();  
  6. Child.prototype.constructor = Child;  
  7. Child.uber = Parent.prototype;  

 

使用的時候,方法如下

 

  1. extend(Cat,Animal);  
  2. var cat1 = new Cat("大毛","黃色");  
  3. alert(cat1.species); // 動物 

 

這個extend函數,就是YUI庫如何實現繼承的方法。

另外,說明一點。函數體最后一行

  1. Child.uber = Parent.prototype; 

意思是為子對象設一個uber屬性,這個屬性直接指向父對象的prototype屬性。這等于是在子對象上打開一條通道,可以直接調用父對象的方法。這一行放在這里,只是為了實現繼承的完備性,純屬備用性質。

6. 拷貝繼承

上面是采用prototype對象,實現繼承。我們也可以換一種思路,純粹采用"拷貝"方法實現繼承。簡單說,如果把父對象的所有屬性和方法,拷貝進子對象,不也能夠實現繼承嗎?

首先,還是把Animal的所有不變屬性,都放到它的prototype對象上。

 

  1. function Animal(){}  
  2. Animal.prototype.species = "動物"

 

然后,再寫一個函數,實現屬性拷貝的目的。

 

  1. function extend2(Child, Parent) {   
  2. var p = Parent.prototype;  
  3. var c = Child.prototype;  
  4. for (var i in p) {   
  5. c[i] = p[i];  
  6. }  
  7. c.uber = p;  
  8. }  

 

這個函數的作用,就是將父對象的prototype對象中的屬性,一一拷貝給Child對象的prototype對象。

使用的時候,這樣寫:

 

  1. extend2(Cat, Animal);  
  2. var cat1 = new Cat("大毛","黃色");  
  3. alert(cat1.species); // 動物 

 

原文地址:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html

【編輯推薦】

  1. Javascript面向對象編程(上) 封裝
  2. WordPress的JavaScript本地化
  3. 關于 JavaScript 的 with 語句
  4. Web移動應用 HTML5 CSS和JavaScript
  5. JavaScript 假如default不是switch的最后一項
責任編輯:于鐵 來源: 阮一峰的博客
相關推薦

2010-10-08 09:13:15

oop模式JavaScript

2011-05-25 11:15:02

Javascript繼承

2012-01-17 09:34:52

JavaScript

2017-04-21 09:07:39

JavaScript對象編程

2012-02-27 09:30:22

JavaScript

2023-09-27 23:28:28

Python編程

2011-05-25 10:21:44

Javascript

2011-05-13 10:51:25

javascript

2011-06-28 14:11:33

JavaScript

2018-12-14 11:30:00

JavaScript編程前端

2010-03-05 14:44:36

Python繼承

2011-07-14 17:37:02

C++面向對象編程思想

2009-01-04 09:08:30

面向對象繼承接口

2010-11-17 11:31:22

Scala基礎面向對象Scala

2023-02-22 18:06:35

函數javascript面向對象編程

2019-11-18 17:05:02

JavaScript面向對象程序編程Java

2022-07-30 23:41:53

面向過程面向對象面向協議編程

2012-12-13 11:01:42

IBMdW

2021-10-21 18:47:37

JavaScript面向對象

2024-09-18 08:13:01

C#封裝繼承
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久69精品久久久久久久电影好 | 日日操夜夜操天天操 | 国产伦精品一区二区三区高清 | 国产精品福利网站 | 亚洲黄色国产 | 国产精品国产成人国产三级 | 亚洲精选久久 | 日韩在线第一 | 九九导航 | 在线播放91 | 韩国毛片一区二区三区 | 免费成人在线网站 | 欧美一区免费 | 欧美成人a | 日韩欧美大片 | 国产精品一区二区三区四区五区 | 国产精品久久久久久久久图文区 | 黑人巨大精品欧美一区二区免费 | 亚洲成人网在线播放 | 五月婷婷在线视频 | 久久久网| 在线免费黄色小视频 | 精品日韩一区二区 | 国产成人99久久亚洲综合精品 | 亚洲国产精选 | 日本黄色片免费在线观看 | 99免费视频 | 亚洲精品电影网在线观看 | 亚洲精品电影网在线观看 | 日韩一区二区免费视频 | 一区二区高清在线观看 | 亚洲一区二区三区四区五区中文 | 免费在线一区二区 | 久久久久亚洲视频 | 精品成人av | 国产精品高潮呻吟久久 | 国产一区二区电影网 | 亚洲第一天堂无码专区 | 毛片免费看 | 四虎影院在线免费观看 | 国产精品免费在线 |