亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript面向對象編程入門教程

2019-11-20 20:49:29
字體:
來源:轉載
供稿:網友

盡管面向對象JavaScript與其他語言相比之下存在差異,并由此引發了一些爭論,但毋庸置疑,JavaScript具有強大的面向對象編程能力

本文先從介紹面向對象編程開始,然后回顧JavaScript對象模型,最后演示JavaScript中的面向對象編程概念。

JavaScript回顧

如果你對諸如變量(variables)、類型(types)、函數(functions)、以及作用域(scope)等JavaScript概念覺得心里沒底,那么你可以閱讀重新介紹JavaScript中的這些主題。你還可以查閱JavaScript 1.5核心指南

面向對象編程

面向對象編程是一種編程范式(paradigm),即使用抽象來創建基于真實世界的模型。它使用了幾種以前建立的范式技術,包括模塊化(modularity)、多態(polymorphism)、和封裝(encapsulation)。今天,許多流行的編程語言(比如Java、JavaScript、C#、C++、Python、PHP、Ruby、以及Objective-C)都支持面向對象編程(OOP)。

面向對象編程可視為使用協作對象集合來進行軟件設計,這與傳統觀點相反,傳統觀點把程序視為函數集合,或者簡化為計算機指令列表。在面向對象編程中,每個對象都具有以下能力:接收消息、處理數據、以及給其他對象發送消息。每個對象都可以視為一個獨立的具有不同角色或責任的小機器。
面向對象編程旨在為編程提升更大的靈活性和可維護性,并在大規模軟件工程中廣泛流行。由于其非常重視模塊化,因此面向對象代碼旨在讓開發更簡單、稍后理解起來更容易,而且相對于較少采用模塊化的編程方法,使得對于復雜情況及步驟的分析、編碼和理解更加直接。

專用術語

類(Class)
~ 定義對象的特征(characteristics)。
對象(Object)
~ 類的實例(Instance)。
屬性(Property)
~ 某一對象特征(characteristic),例如顏色。
方法(Method)
~ 某種對象能力,例如行走。
構造函數(Constructor)
~ 實例化(instantiation)時所調用的方法。
繼承(Inheritance)
~ 一個類可以繼承來自另一個類的特征。
封裝(Encapsulation)
~ 一個類只定義該對象的特征,一個方法只定義該方法如何執行。
抽象(Abstraction)
~ 將某一對象的復雜繼承、方法、屬性結合在一起,而且必須能夠模擬某一現實模型。
多態(Polymorphism)
~ 不同類可能會定義相同的方法或屬性。
對于面向對象編程的進一步描述,參閱維基百科的面向對象編程詞條。

基于原型的編程

基于原型的編程(Prototype-based programming)是一種面向對象編程風格,其中類(classes)并不存在,并且行為重用(在基于類的語言中稱為繼承)是通過粉飾充當原型的現存對象來完成的。這種模式也稱為無類的(class-less)、面向原型的(prototype-oriented)、或基于實例(instance-based)的編程。
關于基于原型語言的最初(且非常規范的)示例就是由David Ungar和Randall Smith開發的Self編程語言。然而,這種無類編程風格最近越來越受歡迎,并且已被一些編程語言采用,例如avaScript、Cecil、NewtonScript、Io、MOO、REBOL、Kevo、Squeak(當使用Viewer框架來操縱Morphic組件時)、及其他幾種語言。

JavaScript面向對象編程

核心對象(Core Objects)

JavaScript有幾個包含在其核心中的對象;例如,Math、Object、Array、以及String等對象。下面的示例演示了如何使用Math對象的random()方法獲取隨機數。

復制代碼 代碼如下:

alert(Math.random());

提示:本例和所有其他示例都假設已在全局范圍內定義了函數名alert(正如包含在web瀏覽器中的alert一樣)。alert函數實際上不是JavaScript本身的一部分。

JavaScript核心對象列表,參閱JavaScript 1.5核心參考:全局對象(Global Objects)。

JavaScript中的每個對象都是一個Object對象的實例,并因此繼承其所有屬性和方法。

自定義對象(Custom Objects)

類(The Class)

JavaScript是基于原型的語言,其中不包含可在如 C++或Java中找到的類聲明(class statement)。有時這會讓一些習慣于具有類聲明語言(languages with a class statement)的程序員感到困惑。不過,JavaScript用函數(functions)作為類。定義一個類簡單到就是定義一個函數。在下例中,我們定義了名為Person(人)的新類。

復制代碼 代碼如下:
function Person() { }


對象(類實例)(The Object (Class Instance))

要創建obj對象的一個新實例,我們使用語句new obj,同時將結果(其類型是obj)賦給某個變量(variable),以便稍后訪問。
在下例中,我們首先定義名為Person的類,然后創建兩個實例(person1和person2)。
復制代碼 代碼如下:
function Person() {}
var person1 = new Person();
var person2 = new Person();

還可參閱新的實例化替代方法Object.create。

構造函數(The Constructor)

當實例化時(創建對象實例的瞬間)是會調用構造函數。構造函數是類的一個方法。而在JavaScript中,會函數(function)作為作為該對象的構造函數;因此,也就無需顯式定義一個構造函數方法。類中聲明的每個行為在實例化時都會執行。

構造函數用于設置對象屬性或調用方法為使用該對象做準備。本文稍后會介紹,通過使用一種不同的語法來添加類方法及其定義 。

在下例中,當實例化Person時,Person類的構造函數會顯示一個警告框。

復制代碼 代碼如下:
function Person() {
    alert('Person instantiated');
}
var person1 = new Person();
var person2 = new Person();

屬性(對象屬性)(The Property (object attribute))

屬性是包含在類中的變量;每個對象實例都有這些屬性。屬性應設置在類(函數)的原型(prototype)屬性中,以便繼承正常工作。
在類中操作屬性是通過this關鍵字實現的,this引用當前對象。在類外部訪問(讀或寫)某個屬性要通過以下語法:InstanceName.Property;這與C++、Java、以及其他一些語言所用語法相同。(在類內部使用this.Property的語法來獲取或設置屬性值)。

在下例中,我們為Person類定義gender(性別)屬性,然后在初始化時定義該屬性。

復制代碼 代碼如下:
function Person(gender) {
    this.gender = gender;
    alert('Person instantiated');
}
var person1 = new Person('Male'); // Male: 男
var person2 = new Person('Female'); // Female: 女
//顯示person1的性別
alert('person1 is a ' + person1.gender); // person1 is a Male

方法(The methods)

方法遵循與屬性相同的邏輯;區別在于它們是函數而且被定義為函數。調用方法與訪問屬性相似,不過你要在方法名末尾添加(),可能會有參數(arguments)。定義一個方法,就是為該類prototype屬性上的某個命名屬性指定一個函數;函數被分配到的那個名稱就是在對象上調用該方法的名稱。
在下例中,我們為Person類定義并使用sayHello()方法。

復制代碼 代碼如下:
function Person(gender) {
    this.gender = gender;
    alert('Person instantiated');
}
Person.prototype.sayHello = function() {
    alert('hello');
};
var person1 = new Person('Male');
var person2 = new Person('Female'); // 調用Person的sayHello方法。
person1.sayHello(); // hello

在JavaScript中,方法是作為屬性被綁定到某個類/對象的普通函數對象,這意味著,可以“脫離上下文(out of the context)”來調用它們??紤]如下示例代碼:

復制代碼 代碼如下:

function Person(gender) {
    this.gender = gender;
}
Person.prototype.sayGender = function() {
    alert(this.gender);
};
var person1 = new Person('Male');
var genderTeller = person1.sayGender;
person1.sayGender(); // alerts 'Male'
genderTeller(); // alerts undefined
alert(genderTeller === person1.sayGender); // alerts true
alert(genderTeller === Person.prototype.sayGender); // alerts true

此示例一次演示了多個概念。這表明,在JavaScript中沒有“基于對象的方法(per-object methods)”,因為該方法的所有引用都指向完全相同的函數,即我們起初在原型上定義的那個函數。當某個函數被作為方法(或確切地說是屬性)調用時,JavaScript會將當前的“對象上下文(object context)”“綁定”到特定的“this”變量。這與調用該函數對象的“call”方法等效,如下所示:
復制代碼 代碼如下:

genderTeller.call(person1); //alerts 'Male'e

更多相關信息,請參閱Function.callFunction.apply

繼承(Inheritance)

繼承是一種方法,用于創建作為一個或多個類專用版本的類。(JavaScript僅支持單類繼承)。這個專用類通常被稱為子類(child),而其他類通常被稱為父類(parent)。在JavaScript中,你要完成繼承,需將父類的實例賦給子類,然后將子類特化(specializing)。

提示:由于JavaScript不檢測的子類的prototype.constructor(原型的構造函數),參閱Core JavaScript 1.5核心參考:Global Objects:Object:prototype屬性,因此我們必須手動指定該值。

在下例中,我們定義Student類作為Person的子類。然后我們重新定義sayHello()方法,并添加sayGoodBye()方法。

復制代碼 代碼如下:

// 定義Person類
function Person() {}
Person.prototype.walk = function() {
    alert('I am walking!');
};
Person.prototype.sayHello = function() {
    alert('hello');
};
// 定義Student類
function Student() {
    //調用父類構造函數
    Person.call(this);
}
// 繼承Person
Student.prototype = new Person(); // 修正構造函數指針,由于它指向Person
Student.prototype.constructor = Student; // 替換sayHello方法
Student.prototype.sayHello = function() {
    alert('hi, I am a student');
}
// 添加sayGoodBye方法
Student.prototype.sayGoodBye = function() {
    alert('goodBye');
}
var student1 = new Student();
student1.sayHello();
student1.walk();
student1.sayGoodBye(); // 檢驗繼承
alert(student1 instanceof Person); // true
alert(student1 instanceof Student); // true


封裝

在上例中,Student無須知曉Person類的walk()方法是如何實現的,但仍可使用該方法;Student類無須顯式定義該方法,除非我們想改變它。這稱為封裝(encapsulation),這樣每個類繼承其父類的方法,并且只需定義它所希望改變的東西。

抽象

抽象是一種機制(mechanism),允許對處理中的問題的當前部分進行建模。這可以通過繼承(特化)或組合(composition)來實現。JavaScript通過繼承實現特化(specialization),通過讓類實例成為其他對象的屬性值實現組合。
JavaScript的Function類繼承自Object類(這說明模型的特化),并且Function.prototype屬性是Object的實例(這說明了組合)。

復制代碼 代碼如下:
var foo = function() {};
alert('foo is a Function: ' + (foo instanceof Function));
alert('foo.prototype is an Object: ' + (foo.prototype instanceof Object));

多態

就像所有的方法和屬性被定義在原型屬性內部一樣,不同的類可以定義具有相同名稱的方法;方法的作用域限于定義它們的類之內。這僅當兩個類之間沒有父子關系(當一個類沒有從繼承鏈中的其他類繼承時)時才為真。

提示

本文中所提出的面向對象編程實現技術不僅適用于JavaScript,因為就如何進行面向對象編程而言,這是非常靈活的。
同樣,這里展示的技術既沒有使用任何語言技巧(language hacks),也沒有模仿其他語言的對象理論實現。
在JavaScript中,還有其他更高級的面向對象編程的技術,但是那些內容已超出了這篇介紹性文章的范圍。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲免费电影| 欧美wwwwww| 日韩毛片在线观看| 国产精品久久久久久久久久三级| 亚洲国产一区二区三区四区| 永久免费精品影视网站| 色综合影院在线| 日韩黄色av网站| 国产精品黄色影片导航在线观看| 亚洲欧美中文另类| 亚洲国产天堂久久国产91| 久久深夜福利免费观看| 精品福利樱桃av导航| 久久伊人精品视频| 国产精品丝袜高跟| 91精品视频在线免费观看| 精品女厕一区二区三区| 欧美极品少妇xxxxⅹ喷水| 亚洲成人动漫在线播放| 97久久精品视频| 日本一区二三区好的精华液| 成人444kkkk在线观看| 欧美午夜片欧美片在线观看| 疯狂做受xxxx高潮欧美日本| 欧美限制级电影在线观看| 亚洲男人天堂古典| 亚洲在线免费视频| 精品久久久久久久久国产字幕| 久久99久久久久久久噜噜| 日韩动漫免费观看电视剧高清| 欧美二区在线播放| 欧美成人四级hd版| 国产精品成人国产乱一区| 欧美日韩国产限制| 在线激情影院一区| 久久久久久免费精品| 欧美日韩黄色大片| 国产精品一区久久久| 久久中文字幕一区| 亚洲精品综合精品自拍| 日韩av在线电影网| 69国产精品成人在线播放| 欧美日韩第一页| 中文字幕亚洲第一| 国产精品久久久| 久久久之久亚州精品露出| xxxxx成人.com| 亚洲天堂av综合网| 久久在精品线影院精品国产| 亚洲精品视频中文字幕| 亚洲欧美激情另类校园| 欧美精品免费在线观看| 亚洲精品久久久久久久久久久久| 乱亲女秽乱长久久久| 亚洲乱码一区av黑人高潮| 日韩h在线观看| 57pao成人永久免费视频| 国产精品一区二区三区免费视频| 国产亚洲精品91在线| 国精产品一区一区三区有限在线| 国产亚洲精品久久| 国产精品福利片| 国产欧亚日韩视频| 日韩美女激情视频| 日韩中文字幕久久| 国产一区二区在线免费| 亚洲福利影片在线| 久久成年人免费电影| 国产日本欧美一区| 91av在线免费观看| 国产精品自产拍在线观看中文| 色爱精品视频一区| 欧美精品福利视频| 亚洲自拍偷拍色图| 欧美精品生活片| 午夜精品免费视频| 久久久噜噜噜久噜久久| 色婷婷av一区二区三区久久| 久久免费视频在线观看| 午夜欧美不卡精品aaaaa| 热门国产精品亚洲第一区在线| 国产日韩精品电影| 亚洲欧美日韩精品久久奇米色影视| 日韩免费av一区二区| 欧美专区在线视频| 欧美性极品xxxx娇小| 少妇高潮久久久久久潘金莲| 亚洲精品久久在线| 91精品在线一区| 一区二区三区美女xx视频| 91精品国产自产在线老师啪| 高清欧美电影在线| 人体精品一二三区| 国产精品99久久久久久久久久久久| 日韩成人激情在线| 欧美精品做受xxx性少妇| 国产69精品久久久久9999| 国产精品福利在线观看网址| 中文字幕在线日韩| 欧美在线视频免费| 精品成人久久av| 狠狠干狠狠久久| 欧美一级淫片播放口| 懂色av中文一区二区三区天美| 日韩精品在线观看视频| 亚洲男人天堂2024| 欧美老肥婆性猛交视频| 91精品视频免费观看| 亚洲人成自拍网站| 日本视频久久久| 精品自在线视频| 国产精品老女人精品视频| 日本精品视频网站| 久久成人国产精品| 在线观看国产精品日韩av| 911国产网站尤物在线观看| 色综合色综合网色综合| 欧美日韩国产综合视频在线观看中文| 欧美亚洲国产成人精品| 日韩精品免费观看| 国产999精品久久久| 国产亚洲欧洲黄色| 国内免费久久久久久久久久久| 55夜色66夜色国产精品视频| www.国产精品一二区| 欧美高清视频在线播放| 亚洲第一精品福利| 91精品国产综合久久男男| 欧美日韩精品二区| 国产91露脸中文字幕在线| 成人免费看吃奶视频网站| 国产欧美日韩中文| 国产视频精品免费播放| 日韩av电影中文字幕| 亚洲欧洲偷拍精品| 久久精品久久久久| 欧美性感美女h网站在线观看免费| 国产精品99久久久久久白浆小说| 91高清视频在线免费观看| 日韩中文字幕视频在线| 亚洲欧美福利视频| 亚洲伊人久久大香线蕉av| 在线观看欧美日韩| 亚洲精品视频中文字幕| 久久久久久久一区二区三区| 国产精品一区二区三区毛片淫片| 亚洲大胆美女视频| 国产精品久久久久久亚洲影视| 在线成人中文字幕| 国产精品激情自拍| 亚洲成人免费在线视频| 91欧美精品午夜性色福利在线| 久久亚洲私人国产精品va| 91在线高清视频| 中文字幕亚洲在线| 日韩美女在线看| 91高潮在线观看| 亚洲国产欧美一区二区三区久久| 欧美日韩国产综合视频在线观看中文| 日韩久久免费电影| 欧美日韩激情视频8区| 日韩在线一区二区三区免费视频| 啪一啪鲁一鲁2019在线视频| 日韩视频免费观看|