1. 程式人生 > >什麼是面向物件,原型,原型鏈繼承

什麼是面向物件,原型,原型鏈繼承

Javascript是一種基於面向物件的語言,你所遇到的東西幾乎幾乎都是物件。面向物件重要的兩個概念:類和物件。這裡要分2種情況,在ES6之前,和ES6語法,這裡先說ES6之前,ES6之前是沒有類的概念的,於是就通過建構函式去模擬類,你可以理解為他們只是人類為了移民火星yy出來的一個概念,他並不是實際存在的只是一個概念,然後就靠著這個概念去一點點的摸索創造,最後終於給造出來了一個飛向火星的太空船,那麼這個太空船就是類的例項化的體現。這就是物件。類又是什麼?屬性和行為。太空船是什麼顏色的由什麼組成,這是他的屬性,他能飛這就是他的行為,那麼ES6之前通過這樣通過函式來模擬類的存在。那麼怎麼建立一個建構函式,有以下三種方式:
一、建構函式的建立
1.js內建的建構函式(String、Object、Array、New、Date、number、function)等,再為他建立屬性和方法

var obj = new Object()
obj.name = "小明"
obj.age = "20"
obj.sayName = function(){
    alert(obj.name)  //小明
}

2.通過字面量建立,還是上面這個例子

var obj = {
name = “小明”,
age = 20,
sayName : function(){
alert(this.name)
}
};
通過這兩個例子你會發現,有很多是重複的程式碼,這並不是一個好的選擇,講完了這2個方式咱們穿插一下,為了解決這個問題,人們開始使用工廠模式

—進口—>生產—>—>出口,既然都是一樣的那就批量來解決。在出口用變數來接收,在這個函式裡輸入引數

function createObj(name,age) {
         var a = new Object()
             a.name = name
             a.age = age
             a.sayName = function(){
             alert(this.name)
     }
     return a
}
var a1 = createObj("小明",18)
var a2 = createObj("小紅"
,20) console.log(a1)

通過createObj( )能夠根據接收的引數來構建一個包含所有必要資訊的Obj物件,可以無數次的呼叫,每次返回包含2個屬性一個方法的物件。不用重複的去寫相同的程式碼,但是,工廠模式雖然解決了這種重複性的問題,但卻沒有解決怎樣去知道這樣一個物件的型別,怎麼去識別物件。我們來看一下第三種建構函式模式
3.自定義建構函式

function createObj(name,age) {
        this.name = name;
        this.age = age;
        this.sayName = function() {
        alert(this.name)
     }
}
var obj1 = new Person('小明',20)
var obj2 = new Person('小紅',18)

細心的朋友可以找一下,這種方式和上一種的不同之處(1)直接將屬性和方法賦給了this物件。(2)沒有return語句。(3)建立例項物件使用了new操作符
在這個例子中obj1 和obj2分別儲存著createObj的兩個不同的例項,這兩個物件都有一個constructor(建構函式)屬性,該屬性指向createObj
可以這樣測試
alert(obj1.constructor == createObj); //true
constructor最初是用來標示物件型別的,但是提到檢測物件型別可以使用instanceof操作符更可靠一些

alert(obj1 instanceof createObj);//true

建構函式和其他函式的唯一區別:呼叫的方式不同,任何函式通過new操作符來呼叫,那他就可以作為建構函式,同理,如果不通過new操作符來呼叫他就是普通函式。
任何事情再好也總是有缺憾,這又上升到哲學層面上了,所以不懂哲學大的IT工程師不是好藝術家。。。那麼建構函式的問題是什麼呢?就是每個方法都要在每個例項上重新建立一遍,因此每定義一個函式也就是例項化一個物件,這樣一來我們就要定義很多個函式,這樣自定義函式也就沒有任何的封裝性了,好在我們可以使用原型模式來解決。
二、原型模式
首先我們要知道,什麼是原型?需不需要我們自己去建立?通過一個程式碼你就知道。原型的兩個關鍵詞: 1.prototype 2. proto

    function Person(name,age) {
            this.name = name;
            this.eat = function() {
                alert('吃飯')
            }
        }
        Person.prototype.age = 20
        var p1 = new Person("小明",20)
        console.log(p1)

列印結果
在這個基礎上我們再給他新增一個方法

    function Person(name,age) {
            this.name = name;
            this.eat = function() {
                alert('吃飯')
            }
        }
        Person.prototype.age = 20
        Person.prototype.run = function(){
            console.log('我能跑')
        }
        var p1 = new Person("小明",20)
        p1.run()
        console.log(p1)

列印結果
你就可以看到通過prototype新增的原型物件是儲存在proto裡的。他d的私有屬性是name,age和run是儲存在原型裡的。由此原型物件最重要的一點就是,通過調研建構函式而建立的那個物件例項的原型物件,使用原型物件的好處他是共享的!那麼如果程式碼非常多的話,我們又怎麼知道哪些是共享的哪些是私有的

console.log(Person.prototype.isPrototypeOf(p1)) //判斷物件是否指向建構函式的原型物件,返回true/false
console.log(p1.hasOwnProperty('name')) // 判斷物件的屬性是在原型中還是例項中

既然說到在原型裡是可以共享的,那該怎麼得到他的屬性和方法呢?
在控制檯裡你可以看到,每一個建構函式都有一個原型物件。proto
假如一個原型又是另一個型別的例項,如此層層遞進,就構成了例項與原型的鏈條,這就是所謂的原型鏈的基本概念,在業務中,我們父類和子類的屬性或者方法是相同的我們就可以繼承原型裡的屬性和方法。原型是可以共享的!前提是要有相同的業務場景和邏輯,這就是繼承,許多的OO語言都支援兩種繼承方式,介面繼承和實現繼承,ECMAscript只支援實現繼承,而實現繼承主要依靠原型鏈。原型鏈的繼承首選會通過自身查詢如果自己找不到會一直像上級查詢一直找到object。我們還是通過程式碼來了解繼承!
原型繼承這裡介紹2種方式
三、繼承
1.原型繼承、
首選還要知道一個概念,被繼承的建構函式叫做(父類、基類)

    function Father(name,money) {
            this.name = name;
            this.money = money;
        }
        Father.prototype.height = 180
        Father.prototype.eat = function() {
            console.log('我會吃飯')
        }
        var f = new Father('王','1000萬')

        function Son(name,money) {
        }
        Son.prototype = new Father()
        var s = new Son()
        s.eat()
        s.name = "jack"
        console.log(s)

這裡父親的私有屬性並沒有賦值,原型裡的height =180 eat()
[列印結果
此時Son已經繼承了Father的height和方法eat
原型繼承的缺憾:沒有自己的私有屬性,繼承來的都放在裡原型裡
只有通過自己手動去新增。s.name = jack,如果新增到原型裡是s.proto.name = “jack”
2.物件冒充(call、apply)
要知道call,和apply的用法

列印結果
物件冒充的缺點:1.不能繼承父類原型的屬性和方法;2.繼承之後會形成私有屬性和方法。
3.組合繼承:
既可以繼承之後形成私有屬性,也可以繼承父類原型中的屬性行為
組合繼承

以上說的都是ES6之前的語法,大家都知道ES6已經有了類的概念,也非常的簡單。ES6的class沒有變數提升, 類必須先宣告再使用,否則會出現異常。ES6的類是class,繼承是extends,敲完下面的程式碼你就會明白


class Father {
//constructor建構函式,初始化一些屬性值
constructor(name,age){
this.name = name;
this.age = age;
}
run() {
alert('跑起來')
}
//static 關鍵字,用來定義一個類的靜態方法,通過類名呼叫 Father.eat()
static eat() {
alert('吃飯')
}
speak() {
alert(this.name+'Father.speak')
}
}
let F = new Father('大毛',60)
console.log(F)
// F.run()
// F.eat()是錯的
// Father.eat()

這裡寫圖片描述

相關推薦

Java程式設計師從笨鳥到菜鳥之(三)面向物件之封裝繼承多型(下)

五:再談繼承   繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且類可以修改或增加

黑馬程式設計師---面向物件上(封裝繼承多型)

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! 面向物件(Object-Oriented,簡稱OO)

java 面向物件面試題問答題構造方法抽象類繼承多型介面異常總結;

一,構造方法的特點 面向物件的思想是如何在java展現的呢? 就是通過類和物件 類是一組相關的屬性和行為的集合。是一個抽象的概念。 物件是該類事物的具體表現形式。具體存在的個體。 一、抽象類的抽象方法的特點是什麼? 被abstract修飾的類稱為抽象類 特點: 1、抽象類不能有物件(不能用new關鍵字來例項化

JavaScript 面向物件(一)——原型

一、類,物件,函式 var obj = {};//物件 obj.num = 10;//js物件中成員的增加,可以通過直接賦值實現 console.log(obj); console.log(window); 執行結果: obj可以看做window的一個成員。 //fun是一

面向物件程式設計介紹類和物件

想一想 請用程式描述如下事情: A同學報道登記資訊 B同學報道登記資訊 C同學報道登記資訊 A同學做自我介紹 B同學做自我介紹 C同學做自我介紹 stu_a = { “name”:“A”, “age”:21, “gender”:1, “hometown”:“河北” } stu_b = {

面向物件——三大特性六大原則

什麼是面向物件 面向物件是軟體開發方法。面向物件的概念和應用已經超越了程式設計和軟體開發,擴充套件到如資料庫系統,互動式介面,應用結構,應用平臺,分散式系統,網路管理結構,CAD技術,人工只能等領域。面向物件是一種對現實世界理解和抽象的方法,是計算機程式設計技術發展到一定階

五個學生每學生有3門課的成績 * 從鍵盤輸入以上資料(學生號姓名三門課成績) * 計算出 平均成績(採用面向物件的方式如學生

/**  * 有五個學生,每學生有3門課的成績,  * 從鍵盤輸入以上資料(學生號,姓名,三門課成績),  * 計算出 平均成績(採用面向物件的方式,如學生類。。。)。  * @author chenkunqing  *  time : 2017/7/21-16

python面向物件常用方法一篇博文勝過一本書

  面向物件(Object Oriented,OO)是軟體開發方法。面向物件的概念和應用已超越了程式設計和軟體開發,擴充套件到如資料庫系統、互動式介面、應用結構、應用平臺、分散式系統、網路管理結構、CAD技術、人工智慧等領域。面向物件是一種對現實世界理解和抽象的方法,是計算機程式設計

面向物件三大特性五大原則

透切理解面向物件三大基本特性是理解面向物件五大基本原則的基礎 三大基本特性:封裝,繼承,多型 封裝,就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。一個類就是一個封裝了資料以及操作這些資料的程式碼的邏輯實體。在一個物件內部,某些程式碼或某些資

面向物件設計模式之---原型模式(Prototype Pattern)

原型模式的定義是: 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。 這個概念看上去很抽象,其實質就是我們在程式設計中經常用到的物件複製,然後我們不免又要提到一個老生常談的話題淺複製與深複製。 先看一下原型模式的UML類圖吧: 其中,P

前端用json形式實現了面向物件的程式設計將json轉為CSV用於前端生成報表

前端程式碼的呼叫如下,封裝部分是怎麼寫的呢? JSonToCSV.setDataConver({                         data: jsonData,                         fileName: '銷售資料',      

面向物件的聚集組成依賴合作關係(終於懂了)

聚集:has a組成:contains  a依賴:一個物件要使用另一個物件,要依賴於另一個物件的定義 。被依賴物件因依賴物件而活。合作:一個物件要使用另一個物件,但是被使用的物件不是隻為使用物件而活。合

面向物件的特點封裝性繼承性多型性!

1.面向物件程式設計有三大特點,分別是封裝,繼承,多型,接下來就介紹一下這三個特點,積累一下。 2.封裝,封裝是面向物件程式設計的核心思想,將物件的屬性和行為封裝起來,而將物件的屬性和行為封裝起來的載體是類,類通常對使用者隱藏其實現的細節,這就是封裝的思想,在Java中通常

黑馬程式設計師————面向物件(概述封裝建構函式thisstatic)

概述:     面向物件(Object Oriented,OO)是當前計算機界關心的重點,它是90年代軟體開發方法的主流。面向物件的概念和應用已超越了程式設計和軟體開發,擴充套件到很寬的範圍。如資料庫系統、互動式介面、應用結構、應用平臺、分散式系統、網路管理結構、CAD技術

JavaScript 面向物件程式設計思想物件的使用方法

程式設計思想:    面向過程:所有事情都是親力親為,注重的是過程    面向物件:提出需求,找物件,物件解決,注重的是結果    Js不是一門面向物件的語言,是基於物件的語言,Js來模擬面向物件    面向物件的特徵:封裝,繼承,多型    物件:具體特指的某個事物,有特徵

面向物件的思維搭建Android與多ble藍芽裝置併發通訊小框架

  此框架支援多種不同型別的ble裝置,同時連線、收發資料,互不干擾。比如APP同時連兩個LED藍芽燈、兩個手環、一個藍芽加熱器,當然連線單個ble裝置,或者只連線一種ble裝置同樣適用本框架。 前言   小白請繞道百度,本文適合有一定Android、ble藍芽、面向物件基礎的同學進階探討,只講關鍵技術點,細

Java 010 面向物件(傳參、式程式設計、包、修飾符、內部類)

知識點梳理 心得體會 小知識點 1.只要返回的是物件就可以用==.調方法,來鏈式程式設計== 2.手動導包時,一定要寫到包的最終目錄,有時候用==*代替是會報錯的 3.protected受保護許可權;只能在子類裡面==呼叫父類受保護成員 4.區域性內部類訪問的外部類資料必須

面向物件的三大基石之二“繼承

1.在繼承的概念上,父類就是最基本的類,相當於做一個模板,父類一定要做的一般化,這樣才有利於子類的擴充套件。 2.子類可以繼承父類的屬性和方法,還可以擴展出自己的屬性和方法。 3.在繼承關係中,父類和子類需要滿足is-a的關係 4.繼承可以防止子

Python(十二)面向物件高階(__slots__ | @property | 多重繼承 | 定製類 | 列舉)

使用__slots__ 正常情況下,當我們定義了一個class,建立了一個class的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。先定義class: class Student(object): pass 然後,嘗試給例項繫結一個屬性: >&g

java基礎-------面向物件三大特性:封裝、繼承、多型

面向物件三大特性: 封裝、繼承、多型; 一、封裝 1、定義: 封裝就是將類的資訊隱藏在類內部,不允許外部程式直接訪問,而是通過該類的方法實現對隱藏資訊的操作和訪問。 2、實現方法: 使用private關鍵字修飾 類內部的屬性; 3、如何訪問: 在類內部定義get、set方法,實行使用物件呼叫