摘要:不要為繼承關(guān)系多帶帶創(chuàng)建新對(duì)象盡量減少運(yùn)行時(shí)的方法搜索將自身屬性改為原型屬性原型鏈的問(wèn)題原型鏈實(shí)際上是多個(gè)構(gòu)造函數(shù)或者對(duì)象之間共享屬性和方法創(chuàng)建子級(jí)的對(duì)象時(shí),不能像父級(jí)的構(gòu)造函數(shù)傳遞任何參數(shù)實(shí)際開(kāi)發(fā)中,很少多帶帶使用原型鏈。
原型 概述 原型是什么
在JavaScript中,函數(shù)是一個(gè)包含屬性和方法的Function類(lèi)型的對(duì)象原型(Prototype)是Function類(lèi)型對(duì)象的一個(gè)屬性。
在函數(shù)定義時(shí)就包含了Prototype屬性,它的初始值是一個(gè)空對(duì)象。在JavaScript中并沒(méi)有定義函數(shù)的原型類(lèi)型,所以原型是任何類(lèi)型的。
原型用于保存對(duì)象的共享屬性和方法,原型的屬性和方法并不會(huì)影響函數(shù)本身的屬性和方法。
//通過(guò)構(gòu)造函數(shù)的Prototype屬性獲取原型 function fun() { console.log("this is function"); }; console.log(fun.prototype);//fun{} console.log(fun["prototype"]);//fun{} //通過(guò)Object對(duì)象的getPortotypeOf(函數(shù)名)方法 console.log(Object.getPrototypeOf(fun));//[Function]原型的屬性和方法
function fun() { console.log("this is function") } /* 設(shè)置屬性的原型和方法 函數(shù)名.prototype.屬性名 = 屬性值 函數(shù)名.prototype.方法名 = function(){}*/ fun.prototype.name = "花間集"; console.log(fun.prototype.name)//花間集原型屬性 自有屬性和原型屬性
自有屬性:通過(guò)對(duì)象的引用添加的屬性。其他對(duì)象無(wú)此屬性,即使有,也是不彼此立的屬性
原型屬性:從原型對(duì)象中繼承來(lái)的屬性,一旦原型對(duì)象屬性值改變,所有繼承該原型的對(duì)象屬性都改變
//定義構(gòu)造函數(shù) function fun(agg) { //構(gòu)造函數(shù)本身的屬性或方法-自有屬性 this.agg = agg; this.age = function () { console.log(100) } } //通過(guò)原型新增的屬性或方法-原型屬性 fun.prototype.name = "白"; /* 通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象 * *不僅有構(gòu)造函數(shù)的自有屬性 * *好友構(gòu)造函數(shù)的原型屬性*/ var fn = new fun(1); console.log(fn.name);//白 console.log(fn.agg);//1檢測(cè)原型屬性
function fun() { this.name = "花間集"http://自有屬性 } //原型屬性 fun.prototype.name = "溫庭筠"; //通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象 var fn = new fun(); /* Object.hasOwnPrototy(屬性名稱(chēng))方法 * 返回值-布爾值 * true-表示存在指定的自有屬性 * false-表示不存在指定的自有屬性*/ console.log(fun.hasOwnProperty("name"))//true /* 使用in關(guān)鍵字檢測(cè)對(duì)象的屬性 * 判斷對(duì)象中是否存在是定屬性(自有屬性或原型屬性) * 返回值-布爾值*/ console.log("name" in fun);//true重寫(xiě)與刪除原型屬性
//創(chuàng)建構(gòu)造函數(shù) function fun() { this.name = "村上春樹(shù)" } //新增與自有屬性同名的原型屬性 fun.prototype.name = "西尾維新"; //用構(gòu)造函數(shù)創(chuàng)建對(duì)象 var fn = new fun(); //當(dāng)自有屬性和原型屬性同名時(shí),自有屬性的級(jí)別高于原型屬性 console.log(fn.name);//村上春樹(shù) //刪除對(duì)象的屬性,自有屬性和原型屬性同名,先刪除自有屬性。 //再刪除一次則刪除原型屬性 delete fn.name; //重新訪問(wèn)對(duì)象的屬性 console.log(fn.name);//西尾維新isPrototypeOf()方法
該方法用來(lái)判斷對(duì)象是否是另一個(gè)對(duì)象的原型
//通過(guò)初始化器方式定義對(duì)象 var obj ={ name : "花間集" }; //定義構(gòu)造函數(shù) function Fun () { this.agg = 2 } //將對(duì)象obj賦值于函數(shù)Fun的原型 Fun.prototype=obj; //用構(gòu)造函數(shù)創(chuàng)建對(duì)象 var fn = new Fun(); //判斷對(duì)象obj是不是對(duì)象fn的原型 var f = obj.isPrototypeOf(fn); console.log(f);//true擴(kuò)展內(nèi)建對(duì)象
JavaScript中的內(nèi)置對(duì)象有些也具有Prototype屬性,利用內(nèi)置對(duì)象的prototype屬性可以為內(nèi)置對(duì)象擴(kuò)展屬性或者方法。
一般建議慎用這種方式,可能會(huì)應(yīng)瀏覽器版本問(wèn)題導(dǎo)致沖突。
/* 原型鏈 * 類(lèi)似于子級(jí)可以直接使用父級(jí)的屬性或者方法 * 構(gòu)造函數(shù)或者對(duì)象的原型一級(jí)一級(jí)的指向Object的原型 * 后面的可以直接使用前面的原型定義->實(shí)現(xiàn)繼承*/ function A () { this.a = "a" } var a = new A();//通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象 function B () { this.b = "b" } //B函數(shù)的原型指向?qū)ο骯 B.prototype=a; //構(gòu)造函數(shù)創(chuàng)建對(duì)象 var b = new B(); console.log(b.a);//a console.log(b.b);//b function C () { this.c = "c" } //C函數(shù)的原型指向b對(duì)象 C.prototype=b; //創(chuàng)建構(gòu)造函數(shù) var c = new C(); console.log(c.a);//a console.log(c.b);//b console.log(c.c);//c只繼承于原型的原型鏈
出于對(duì)效率的考慮,盡可能的降屬性和方法添加到原型上。
不要為繼承關(guān)系多帶帶創(chuàng)建新對(duì)象
盡量減少運(yùn)行時(shí)的方法搜索
function A () { //將自身屬性改為原型屬性 } A.prototype.a="a"; function B () { } B.prototype = A.prototype; B.prototype.b="b"; var b = new B(); console.log(b.a);//a console.log(b.b);//b function C () { this.c="c" } C.prototype = B.prototype; var c = new C(); console.log(c.a);//a console.log(c.b);//b console.log(c.c);//c原型鏈的問(wèn)題
原型鏈實(shí)際上是多個(gè)構(gòu)造函數(shù)或者對(duì)象之間共享屬性和方法
創(chuàng)建子級(jí)的對(duì)象時(shí),不能像父級(jí)的構(gòu)造函數(shù)傳遞任何參數(shù)
實(shí)際開(kāi)發(fā)中,很少多帶帶使用原型鏈。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/108259.html
摘要:首先,需要來(lái)理清一些基礎(chǔ)的計(jì)算機(jī)編程概念編程哲學(xué)與設(shè)計(jì)模式計(jì)算機(jī)編程理念源自于對(duì)現(xiàn)實(shí)抽象的哲學(xué)思考,面向?qū)ο缶幊淌瞧湟环N思維方式,與它并駕齊驅(qū)的是另外兩種思路過(guò)程式和函數(shù)式編程。 JavaScript 中的原型機(jī)制一直以來(lái)都被眾多開(kāi)發(fā)者(包括本人)低估甚至忽視了,這是因?yàn)榻^大多數(shù)人沒(méi)有想要深刻理解這個(gè)機(jī)制的內(nèi)涵,以及越來(lái)越多的開(kāi)發(fā)者缺乏計(jì)算機(jī)編程相關(guān)的基礎(chǔ)知識(shí)。對(duì)于這樣的開(kāi)發(fā)者來(lái)說(shuō) J...
摘要:之前有朋友問(wèn)怎么去理解原型和原型鏈的問(wèn)題。理解原型鏈的小技巧將箭頭視作泛化子類(lèi)到父類(lèi)關(guān)系那么圖中所有的虛線將構(gòu)成一個(gè)繼承層級(jí),而實(shí)線表示屬性引用。原型鏈?zhǔn)菍?shí)現(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問(wèn)怎么去理解原型和原型鏈的問(wèn)題。這個(gè)問(wèn)題,在面試中,很多同學(xué)經(jīng)常都會(huì)遇到。這里給大家講講,方便大家記憶。 JavaScript的特點(diǎn)JavaScript是一門(mén)直譯式腳本...
摘要:之前有朋友問(wèn)怎么去理解原型和原型鏈的問(wèn)題。理解原型鏈的小技巧將箭頭視作泛化子類(lèi)到父類(lèi)關(guān)系那么圖中所有的虛線將構(gòu)成一個(gè)繼承層級(jí),而實(shí)線表示屬性引用。原型鏈?zhǔn)菍?shí)現(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問(wèn)怎么去理解原型和原型鏈的問(wèn)題。這個(gè)問(wèn)題,在面試中,很多同學(xué)經(jīng)常都會(huì)遇到。這里給大家講講,方便大家記憶。 JavaScript的特點(diǎn)JavaScript是一門(mén)直譯式腳本...
摘要:如下所示在規(guī)范中,已經(jīng)正式把屬性添加到規(guī)范中也可以通過(guò)設(shè)置和獲取對(duì)象的原型對(duì)象對(duì)象之間的關(guān)系可以用下圖來(lái)表示但規(guī)范主要介紹了如何利用構(gòu)造函數(shù)去構(gòu)建原型關(guān)系。 前言 在軟件工程中,代碼重用的模式極為重要,因?yàn)樗麄兛梢燥@著地減少軟件開(kāi)發(fā)的成本。在那些主流的基于類(lèi)的語(yǔ)言(比如Java,C++)中都是通過(guò)繼承(extend)來(lái)實(shí)現(xiàn)代碼復(fù)用,同時(shí)類(lèi)繼承引入了一套類(lèi)型規(guī)范。而JavaScript是...
摘要:在最開(kāi)始的時(shí)候,原型對(duì)象的設(shè)計(jì)主要是為了獲取對(duì)象的構(gòu)造函數(shù)。同理數(shù)組通過(guò)調(diào)用函數(shù)通過(guò)調(diào)用原型鏈中描述了原型鏈的概念,并將原型鏈作為實(shí)現(xiàn)繼承的主要方法。 對(duì)象的創(chuàng)建 在JavaScript中創(chuàng)建一個(gè)對(duì)象有三種方式。可以通過(guò)對(duì)象直接量、關(guān)鍵字new和Object.create()函數(shù)來(lái)創(chuàng)建對(duì)象。 1. 對(duì)象直接量 創(chuàng)建對(duì)象最直接的方式就是在JavaScript代碼中使用對(duì)象直接量。在ES5...
摘要:并沒(méi)有類(lèi)繼承模型,而是使用原型對(duì)象進(jìn)行原型式繼承。我們舉例說(shuō)明原型鏈查找機(jī)制當(dāng)訪問(wèn)一個(gè)對(duì)象的屬性時(shí),會(huì)從對(duì)象本身開(kāi)始往上遍歷整個(gè)原型鏈,直到找到對(duì)應(yīng)屬性為止。原始類(lèi)型有以下五種型。此外,試圖查找一個(gè)不存在屬性時(shí)將會(huì)遍歷整個(gè)原型鏈。 Javascript 并沒(méi)有類(lèi)繼承模型,而是使用原型對(duì)象 prototype 進(jìn)行原型式繼承。 盡管人們經(jīng)常將此看做是 Javascript 的一個(gè)缺點(diǎn),然...
閱讀 3568·2023-04-26 02:31
閱讀 3711·2021-11-23 09:51
閱讀 1348·2021-11-17 09:33
閱讀 2509·2021-11-16 11:45
閱讀 2628·2021-10-11 11:12
閱讀 2500·2021-09-22 15:22
閱讀 2797·2021-09-04 16:40
閱讀 2651·2021-07-30 15:30