1. 程式人生 > >javaScript物件 原型深入理解 繼承

javaScript物件 原型深入理解 繼承

javaScript物件 原型繼承 建構函式繼承 組合繼承

  1. javaScript是指令碼語言。指令碼程式在執行時,是由系統的一個直譯器,將其一條條的翻譯成機器可識別的指令,並按程式順序執行。指令碼語言是為了縮短傳統的編寫-編譯-連結-執行(edit-compile-link-run)過程而建立的計算機程式語言。一個指令碼通常是解釋執行而非編譯。

  2. 資料型別

    字串(String)、數字(Number)、布林(Boolean)、陣列(Array)、物件(Object)、空(Null)、未定義(Undefined)。

    陣列

    var ar = new Array();
    ar[0] = "bmw";
    ar[1] = "byd";
    var ar2 = ["a","b"];
    var ar3 = new Array("aa","bb");
    

    Undefined

    Undefined這個值表示變數不含有值。
    

    物件建立的幾種方式
    1、 var obj = new Object();
    obj.name=”lmj”;
    obj.age = 26;
    2、 var obj = {name:”lmj”,age:26};//字面量
    3、 建構函式
    function Persion(name,age){
    this.name = name;
    this.age = age;
    this.sayName = function(){
    alert(this.name);
    }
    }
    var obj = new Persion(“lmj”,26);

    在建構函式中,給物件添加了一個sayName()方法,
    所以每次在new物件的時候,都會新建立一個sayName()方法。    
    也就是說不同的物件擁有不同的sayName()例項。為了解決這個問題,
    就需要用到原型。
    

    4、原型模式
    理解原型物件prototype
    我們建立的每個函式都有一個prototype屬性,這個屬性是一個指標(當然可以修改這個指標)
    指向一個物件,而這個物件的用途是包含可以由特定型別的所有例項共享的屬性和方法。

    function Person(){

    }

    Person.prototype.name = “jack”;
    Person.prototype.age = 20;
    Person.prototype.sayName = function(){
    alert(this.name);
    }

    var p = new Person();
    //p這個例項物件可以呼叫sayName方法,是由於搜尋原型物件可以找到了sayName方法
    p.sayName();
    p.name = “zhansan”;
    alert(p.name); //這個時候回輸出zhansan,因為查詢的時候會先從例項物件的屬性中查詢,查詢到了name屬性為zhansan,就不會再去查詢prototype物件的屬性,相當於prototype被遮蔽了,這個時候想要使用prototype中的屬性,只有呼叫delete p.name方法刪除例項物件的屬性

    再來理解prototype指向一個物件,而這個物件的用途是包含可以由特定型別的所有例項共享的屬性和方法。
    所有構造方法的例項,都有共同的prototype物件,通過查詢,每個例項都用了相同的prototype所有的屬性。

修改Persion.prototype指標,修改之前的例項的prototype還是指向原來的prototype,修改之後建立的例項的prototype指向修改後的指標。如果是系統預設給建立的prototype的constructor才指向Person函式
看一個prototype修改後的圖片,這個把字面量物件加了constructor屬性,並且指向Person。預設是指向Object
這裡寫圖片描述
這裡寫圖片描述

>注意問題:  
>在原型物件中,新增公共的屬性和方法;  
>由於一個函式的原型物件只有一個,如果原型物件的屬性是引用資料型別,   
>那麼new 出來的所有物件的引用資料型別的屬性都是同一個。   
>下面的例子中,第一個物件將會影響第二個物件  

    //輸出快捷鍵,輸出的內容.log 然後按tag鍵

//1、字面量建立物件
var p1 = {name:”Json”,age:26,sayName:function () {
console.log(this.name);
}};
p1.sayName();
//2、new Object
var p2 = new Object();
p2.name=”老羅”;
p2.age=36;
p2.sayName = function () {
console.log(this.name);
}
p2.sayName();
//3、建構函式
function Persion (name,age) {
this.name = name;
this.age = age;
this.sayName =function () {
console.log(this.name);
}
}
var p3 = new Persion(“羅永浩”,36);
p3.sayName();
//4、工廠方法
function PersionFactory(name,age) {
var p = new Object();
p.name = name;
p.age = age;
p.sayName = function () {
console.log(this.name);

}
return p;

}
var p4 = PersionFactory(“雷軍”,46);
p4.sayName();
//5、原型模式,原型物件與funciton對應且唯一存在,這樣可以解決物件funciton不被重複建立,
// 但是原型物件中的引用型別屬性會被所有物件共同持有
function Phone() {

}
Phone.prototype.name=”預設手機”;
Phone.prototype.colors =[“黑”,”白”];//預設顏色
Phone.prototype.showColors = function () {
console.log(this.name+”:”+this.colors);
}
var p5 = new Phone();
p5.name = “小米”;
p5.colors.push(“灰色”);//小米新增灰色
p5.showColors();
var p51 = new Phone();
p51.name=”錘子”;
p51.showColors();
//————————————————————————————————-
/**
* 繼承
* 1、直接通過原型繼承,屬性和方法都寫在建構函式中
* 2、直接通過原型繼承,屬性和方法都寫在原型中
* 3、直接通過建構函式繼承
* 4、通過建構函式和原型組合繼承
*
*/
//第一種方式
function SuperType() {
this.colors = [“black”,”white”];
this.showColors = function () {
console.log(this.colors);
}
}
function ChildType() {

}
ChildType.prototype = new SuperType();
var child1 =new ChildType();
child1.showColors();
child1.colors.push(“gary”)
var child2 = new ChildType();
child2.showColors();
/*輸出結果: [ ‘black’, ‘white’ ]
[ ‘black’, ‘white’, ‘gary’ ]
明顯通過原型繼承,物件的屬性都是來自原型,而原型唯一存在,所以引用型別變數的地址被拷貝給每一個new出來的物件
*/
// 方式2和方式1 是一樣的,方式2解決了物件的方法不會被重複建立,但是原型繼承還是會造成引用型別的共用

//方式3 建構函式繼承
function ChildType3() {
SuperType.call(this);
}
var child31=new ChildType3();
child31.showColors();
child31.colors.push(“gary”)
var child32 = new ChildType3();
child32.showColors();
/**
* 輸出結果: [ ‘black’, ‘white’ ]
[ ‘black’, ‘white’ ]
引用型別的變數並沒有相互影響,其實就是相當於在子類的建構函式中,呼叫了父類的建構函式跑了一遍,這樣父類建構函式中
宣告的變數,子類也去聲明瞭一遍,程式碼就複用了一下。
但是,在建構函式中宣告方法屬性,每個new出來的物件還是會每次都建立一個方法,所以要想方法的複用就需要組合繼承
*/

//4、建構函式和原型組合繼承
// 在子類中呼叫父類建構函式,將非方法的成員變數在建構函式中宣告,將方法放在原型中宣告
function SuperType4(name) {
this.name = name;
this.colors=[“blue”,”green”];
}
SuperType4.prototype.showColors = function () {
console.log(this.name+”:”+this.colors);
}

function ChildType4(name) {
SuperType4.call(this,name);//建構函式繼承
}
ChildType4.prototype = new SuperType4();

var child41=new ChildType4(“Json”);
child41.colors.push(“gary”);
child41.showColors();
var child42 = new ChildType4(“Perter”);
child42.showColors();
/*
輸出結果:
Json:blue,green,gary
Perter:blue,green
看出物件的引用型別沒有相互影響,
所以組合繼承,實現了引用型別屬性獨立存在,並且方法實現共用。
*/

相關推薦

javaScript物件 原型深入理解 繼承

javaScript物件 原型繼承 建構函式繼承 組合繼承 javaScript是指令碼語言。指令碼程式在執行時,是由系統的一個直譯器,將其一條條的翻譯成機器可識別的指令,並按程式順序執行。指令碼語言是為了縮短傳統的編寫-編譯-連結-執行(edit-com

javascript學習記錄(三)-this物件深入理解

this 物件是基於執行的環境而決定的,this物件分為兩類(本人認為的):全域性this以及區域性this。 全域性this我們通常是指向Windows的,區域性this是指向函式內部的。但是也有特殊的情況-閉包。如下程式碼'use strick'; var name =

JS 物件,原型理解

函式是一種特殊的物件。原型可以理解為工廠生產的模子。 物件分為普通物件和函式物件,Object(),Function()是JS自帶的函式。 Function()是一個特例,可以理解為函式生產工廠(總工廠),負責生產函式(子工廠)。連Object()也是其生產的。 so,

多執行緒同步-互斥物件深入理解Mutex)

多執行緒之執行緒同步Mutex (功能與Critial Sections相同,但是屬於核心物件,訪問速度較慢,可以被不同程序呼叫)一 Mutex 互斥物件(mutex)核心物件能夠確保執行緒擁有對單個資源的互斥訪問權。實際上互斥物件是因此而得名的。互斥物件包含一個使用數量,

JavaScript物件系統深入剖析3-建立物件Object.Create

3.建立物件Object.Create  @吳穹Adam 看這兩天同學們的反饋還是覺得比較難懂,因此,決定再舉一個例子幫助大家理解吧,後面有關Scope和閉包Closure的精彩內容就只好晚一點寫了! 其實,這個系列不是寫給初學者的,而是寫給那些中級JS程式設計師的,對JS有一定的認識,希望這個系列能

Objective-C 物件模型深入理解

0x00序 本著加深對Objective-C 物件模型的理解和記憶目的,於是有了下文的簡單實踐操作。 0x01 疑問 在以下程式碼中,你能描述清楚以下問題嗎? TestClass的例項物件tcA和tcB的記憶體結構是怎麼樣的 TestClass

深入理解 Javascript Prototype 原型繼承

什麼是prototype: js物件定義函式物件中有一個prototype屬性,prototype屬性又指向了一個prototype物件,注意prototype屬性與prototype物件是兩個不同的東西,要注意區別。在prototype物件中又有一個constructor屬性,這個constr

深入理解JavaScript原型原型鏈、繼承

建構函式,原型物件,例項物件三者之間的關係 1.建構函式可以例項化物件 2.建構函式中有一個prototype屬性,是建構函式的原型物件 3.原型物件(prototype)中有constructor構造器指向的是當前原型物件所在的建構函式 4.例項物件的__proto__原型指向建

深入理解JavaScript原型鏈與繼承

原型鏈 原型鏈一直都是一個在JS中比較讓人費解的知識點,但是在面試中經常會被問到,這裡我來做一個總結吧,首先引入一個關係圖: 一.要理解原型鏈,首先可以從上圖開始入手,圖中有三個概念: 1.建構函式: JS中所有函式都可以作為建構函式,前提是被new操作符操作; function P

深入理解JavaScript函式、建構函式、物件、prototype(原型物件)的關係。

學了這麼久前端,一直搞不明白函式與物件之間的關係,實在慚愧,是時候總結一下了。。以下是學習時的記錄,若有錯誤之處,請指出。。 首先我們要知道js中的資料型別有以下幾種: Number   Boolean   undefined     Object &

深入理解JavaScript原型物件

JavaScript的繼承機制是基於原型,而不是類。因此要理解JavaScript的繼承機制,需要更深入瞭解原型物件。 先區分一下基於原型的常見寫法: 這3種寫法prototype,getPrototypeOf和__proto__之間的不同: C.prototype:用

JavaScript(面向物件+原型理解+繼承+作用域鏈和閉包+this使用總結)

JavaScript(面向物件+原型理解+繼承+作用域鏈和閉包+this使用總結) 一、面向物件 1、什麼是面向物件 ☞ 面向物件就是把構成問題事物分解成多個物件,建立物件不是為了

深入理解javascript原型和閉包(6)——繼承

reac __proto__ 區分 深入 app mooc 屬性 lan 裏來 為何用“繼承”為標題,而不用“原型鏈”? 原型鏈如果解釋清楚了很容易理解,不會與常用的java/C#產生混淆。而“繼承”確實常用面向對象語言中最基本的概念,但是java中的繼承與javascri

深入理解javascript原型

undefine tor ace 對象實例 高級 code turn 三方 true 理解原型 原型是一個對象。其它對象能夠通過它實現屬性繼承。不論什麽一個對象都能夠成為繼承,全部對象在默認的情況下都有一個原型。由於原型本身也是對象,所以每一個原型自身又有一個原型

深入理解javascript原型和閉包(轉)

原型鏈 面向 type www. 作用域 url tle das 經歷 深入理解javascript原型和閉包(完結) 說明:   該教程繞開了javascript的一些基本的語法知識,直接講解javascript中最難理解的兩個部分,也是和其他主流面向對

鏈接:深入理解javascript構造函數和原型對象

原型對象 函數 href 深入理解java asc 構造 rip spa tar 鏈接:深入理解javascript構造函數和原型對象http://www.jb51.net/article/55539.htm 鏈接:深入理解javascript構造函數和原型對象

深入理解javascript原型和閉包(3)——prototype原型

scrip 理解 隱藏 函數 col java 再看 深入理解java blog 上文中提到對象是函數創建得,而函數也是一種對象。對象就是屬性的集合,沒有方法。 每個函數都有一個屬性——prototype。 這個prototype的屬性值是一個對象(屬性的集合),默認有一個

深入理解javascript原型和閉包(5)——instanceof

怪異 都是 ava type col function 深入理解java 為什麽 bject 對於值類型來說,可以用typeof判斷,但typeof判斷引用類型的時候返回值只有object/function,並不知道到底是哪一個。這個時候就要用到instance。例如 上

深入理解javascript原型和閉包(12)——閉包

執行環境 分享圖片 script com 活動 時有 mage ava 五步 閉包的官方定義時有權訪問另一個函數作用域中的變量的函數。 閉包有兩種用法:函數作為返回值,函數作為參數傳遞 第一:函數作為返回值 上面代碼中,bar函數作為fn函數的返回值,賦值給了變量f1,因

Javascript 類、原型鏈、繼承理解

自己 test 參數 自動 3.3 圖片 返回值 面向 指向 一、序言 ??和其他面向對象的語言(如Java)不同,Javascript語言對類的實現和繼承的實現沒有標準的定義,而是將這些交給了程序員,讓程序員更加靈活地(當然剛開始也更加頭疼)去定義類,實現繼承。(以下不討