真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javascript原型鏈,原型鏈js簡(jiǎn)書(shū)

js中什么是原型對(duì)象和原型鏈

每個(gè) JavaScript 對(duì)象內(nèi)部都有一個(gè)指向其它對(duì)象的“指針”或者 “引用“, 并通過(guò)這種方式在對(duì)象之間建立了一種聯(lián)系,形成了一種鏈?zhǔn)浇Y(jié)構(gòu),我的理解這就是所謂的原型鏈。

目前創(chuàng)新互聯(lián)已為超過(guò)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、浮山網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

function?F()?{}?//?F?是一個(gè)函數(shù),函數(shù)也是對(duì)象,而且每個(gè)函數(shù)都有一個(gè)屬性叫:"prototype"

var?o?=?new?F();?//?F.prototype?就是?o?的原型對(duì)象

console.log(o.name);

//?輸出:?undefined

F.prototype.name?=?"foo";

console.log(o.name);

//?輸出:?foo

//?上面這個(gè)例子是想說(shuō)明:通過(guò)?new?在對(duì)象?o?與對(duì)象?F.prototype?之間建立了聯(lián)系,?這個(gè)建立聯(lián)系

//?的方式有人叫?"原型繼承"?。?當(dāng)訪問(wèn)的對(duì)象屬性不存在時(shí),就會(huì)沿著原型鏈去查找。

js原型和原型鏈的理解是什么?

講原型和原型鏈,如果是講定義,那很是晦澀難懂,今天我們就通俗易懂的說(shuō)說(shuō)原型與原型鏈。還需要借助阮老師的“Javascript繼承機(jī)制的設(shè)計(jì)思想”。

1,比如我們還要針對(duì)學(xué)生統(tǒng)計(jì)每個(gè)人的總分是多少,我們改造構(gòu)造函數(shù)Person,構(gòu)造函數(shù)上有個(gè) prototype屬性,這個(gè)屬性就是這個(gè)構(gòu)造函數(shù)的原型(顯式原型),這個(gè)原型是函數(shù)特有,prototype對(duì)象默認(rèn)有兩個(gè)屬性,constructor屬性和__proto__屬性。

2,constructor,這個(gè)屬性包含了一個(gè)指針,指回原構(gòu)造函數(shù)。通過(guò)控制臺(tái)輸出,我們可以看到我們實(shí)例化的對(duì)象,有個(gè)__proto__屬性,這個(gè)屬性就是隱式原型,這個(gè)__proto__是所有對(duì)象都有的屬性。

3,由于JavaScript的一切都是對(duì)象(除undefined),又由于所有對(duì)象都有__proto__屬性,__proto__又指向構(gòu)造函數(shù)的prototype,當(dāng)我們?cè)L問(wèn)一個(gè)對(duì)象的屬性時(shí)。

4,如果這個(gè)對(duì)象內(nèi)部不存在這個(gè)屬性,那么他就會(huì)去__proto__里找這個(gè)屬性,這個(gè)__proto__又會(huì)有自己的__proto__,于是就這樣 一直找下去,也就是我們平時(shí)所說(shuō)的原型鏈的概念。原型鏈,說(shuō)明是鏈?zhǔn)?,而不是環(huán),說(shuō)明有終點(diǎn),它的終點(diǎn)是null。

js原型鏈和繼承的理解

Object() Function() Array() 等等都為構(gòu)造函數(shù)。

Js 面向?qū)ο笈c傳統(tǒng)oop 有些不同,語(yǔ)法較高級(jí) 語(yǔ)法糖封裝。

This 為指針。指向this作用域的調(diào)用者

1.原型繼承鏈頂端為Object 。Js函數(shù)是對(duì)象

2.當(dāng)讀取對(duì)象中的屬性時(shí),先去實(shí)例本身中搜索,如搜索不到則去指向的原型中搜索

1.原型的存在意義在于實(shí)現(xiàn)繼承共享,是在構(gòu)造函數(shù)中定義的一個(gè)成員對(duì)象,在下次實(shí)例化時(shí)不需要在構(gòu)造函數(shù)中定義成員 就可實(shí)現(xiàn)實(shí)例共享方法屬性。

例子:通常為。 構(gòu)造函數(shù).prototype.xxx=我想實(shí)現(xiàn)實(shí)例繼承的東西 -》 new 構(gòu)造函數(shù) -》新實(shí)例a對(duì)象.原型指針指向構(gòu)造函數(shù)的xxx對(duì)象(引用類(lèi)型)

例子:Array 不等于 Array() 原因 Array為一個(gè)函數(shù),而Array()為一個(gè)構(gòu)造函數(shù)調(diào)用語(yǔ)句,故Array擁有prototype對(duì)象用于實(shí)例的共享繼承,Array()產(chǎn)生一個(gè)實(shí)例 故只能擁有prototype對(duì)象的私有指針 proto

2.在使用原型繼承時(shí) 不能使用字面量 構(gòu)造函數(shù).prototype={} 的方式重寫(xiě)原型對(duì)象 。因?yàn)闀?huì)導(dǎo)致該原型對(duì)象的constructor屬性被重寫(xiě),在生成的實(shí)例中導(dǎo)致constructor指向Object并且會(huì)切斷之前原型對(duì)象的聯(lián)系,破壞原型鏈。

3.JavaScript 主要通過(guò)原型鏈實(shí)現(xiàn)繼承。原型鏈的構(gòu)建是通過(guò)將一個(gè)類(lèi)型的實(shí)例賦值給另一個(gè)構(gòu)造函數(shù)的原型實(shí)現(xiàn)的

例子:

xxx實(shí)例. proto -》function xxx()構(gòu)造函數(shù).prototype對(duì)象故xxx. proto === xxx.prototype

xxx.prototype. proto -》Object.prototype因?yàn)樗袑?duì)象都為Object函數(shù)構(gòu)造來(lái)的。故xxx.prototype. proto ===Object.prototype。

Object.prototype. proto 為原型鏈頂端 proto 定義了尚未使用所以為null故Object.prototype. proto ===null約定俗成。

instanceof 用來(lái)判斷某實(shí)例是否為某構(gòu)造函數(shù)的實(shí)例

isPrototypeOf 用于判斷某實(shí)例是否擁有某構(gòu)造函數(shù)的原型對(duì)象指針

1.原型模式有忽略構(gòu)造函數(shù)定義初始值步驟及原型中操作引用類(lèi)型的缺點(diǎn)。

所以需要組合使用 構(gòu)造函數(shù)模式+原型模式 來(lái)創(chuàng)建實(shí)例。在構(gòu)造函數(shù)中定義實(shí)例的屬性,而需共享的方法就定義在原型對(duì)象中。

繼承:在子構(gòu)造函數(shù)中調(diào)用 父.call(this, name); 實(shí)現(xiàn)構(gòu)造函數(shù)之間的屬性繼承。使用 子.prototype = new 父(); 子.prototype.constructor = 子;實(shí)現(xiàn)方法的繼承。

2.如要在生產(chǎn)環(huán)境下的構(gòu)造函數(shù)新增方法(如Array) 需要使用一個(gè)類(lèi)似于工廠函數(shù)的寄生構(gòu)造函數(shù)模式 在構(gòu)造函數(shù)中返回一個(gè)修改后的對(duì)象

javascript原型,原型鏈 有什么特點(diǎn)

javascript原型,原型鏈特點(diǎn):原型鏈實(shí)現(xiàn)了繼承。

JS中每個(gè)函數(shù)都存在有一個(gè)原型對(duì)象屬性prototype。并且所有函數(shù)的默認(rèn)原型都是Object的實(shí)例。每個(gè)繼承父函數(shù)的子函數(shù)的對(duì)象都包含一個(gè)內(nèi)部屬性proto。該屬性包含一個(gè)指針,指向父函數(shù)的prototype。若父函數(shù)的原型對(duì)象的_proto_屬性為再上一層函數(shù)。在此過(guò)程中就形成了原型鏈。

原型鏈的作用是用來(lái)實(shí)現(xiàn)繼承,比如我們新建一個(gè)數(shù)組,數(shù)組的方法就是從數(shù)組的原型上繼承而來(lái)的。

var arr = [];

arr.map === Array.prototype.map //arr.map

是從arr.__proto__上繼承下來(lái)的,arr.__proto__也就是Array.prototype。

擴(kuò)展資料:

1.JS中每個(gè)函數(shù)都存在有一個(gè)原型對(duì)象屬性prototype。并且所有函數(shù)的默認(rèn)原型都是Object的實(shí)例。

2.每個(gè)繼承父函數(shù)的子函數(shù)的對(duì)象都包含一個(gè)內(nèi)部屬性_proto_。該屬性包含一個(gè)指針,指向父函數(shù)的prototype。若父函數(shù)的原型對(duì)象的_proto_屬性為再上一層函數(shù)。在此過(guò)程中就形成了原型鏈。

3.原型鏈實(shí)現(xiàn)了繼承。原型鏈存在兩個(gè)問(wèn)題:a 包含引用類(lèi)型值的原型屬性會(huì)被所有實(shí)例共享。b 在創(chuàng)建子類(lèi)型時(shí),無(wú)法向超類(lèi)型的構(gòu)造函數(shù)中傳遞參數(shù)。

參考資料:百度百科-javascript

javascript 原型,原型鏈?zhǔn)鞘裁??有什么特點(diǎn)

原型是JS的一個(gè)引用對(duì)象,就是說(shuō)prototype本身就是一個(gè)對(duì)象,和OBJECT沒(méi)什么不同

所有的屬性中都會(huì)包含一個(gè)屬性__proto__來(lái)指向你的原型對(duì)象

例如

function?ROOT(){}

ROOT.A?=?1

ROOT.prototype.B?=?2;

//object對(duì)象是默認(rèn)指向OBJECT直到你指定一個(gè)proto指針

//這里由于child本身是已經(jīng)實(shí)例化的OBJECT,所以會(huì)復(fù)制一份指定的root的prototype指針引用到child

var?child?=?{__proto__:ROOT.prototype}

//這里是child1原__proto__是指向空的object

//這里對(duì)child1的prototype指針進(jìn)行了替換

var?child1?=?function?(){};

child1.prototype?=?ROOT.prototype

//剩下的結(jié)果就不說(shuō)了

var?chd?=?new?child1;

console.log(child.B)

console.log(chd.B)

//你會(huì)發(fā)現(xiàn)除了child無(wú)法實(shí)例化,其他的特性都繼承了

console.log(chd.constructor)

console.log(chd.__proto__)

console.log(child.constructor)

console.log(child.__proto__)

所以這里面

__proto__是指向的創(chuàng)建者的原型對(duì)象

constructor是指向的創(chuàng)建者

prototype是當(dāng)前對(duì)象的原型對(duì)象

實(shí)例化的對(duì)象會(huì)先從實(shí)例化對(duì)象里查找屬性,如果找不到會(huì)在__proto__里面查找指向的prototype的屬性

在JavaScript的原型鏈繼承方式中,為什么子類(lèi)在調(diào)用父類(lèi)的構(gòu)造函數(shù)時(shí)不能傳參數(shù)?

我認(rèn)為,不是不能給父類(lèi)構(gòu)造函數(shù)傳參數(shù),而是傳的參數(shù)最終不能起到作用。舉個(gè)例子:

function Parents(ln) { this.lastName=ln; } //定義父類(lèi)構(gòu)造函數(shù)

function Children(fn,ln) { this.firstName=fn; } //定義子類(lèi),lastName 繼承自父類(lèi)

//原型鏈繼承,給父類(lèi)構(gòu)造函數(shù)傳入?yún)?shù),試圖用 Children 類(lèi)構(gòu)造函數(shù)中傳入的 ln 初始化 lastName:

Children.prototype=new Parents(this ln);

//嘗試建立對(duì)象實(shí)例:

var child=new Children("Bill","Gates");

//輸出結(jié)果。很明顯,lastNmae 并沒(méi)有得到想要的值:

alert(child.firstName);//Bill

alert(child.lastName);//Undefine

這說(shuō)明給父類(lèi)構(gòu)造函數(shù)傳遞參數(shù)是無(wú)效的。原因就在于原型鏈方式中,調(diào)用父類(lèi)構(gòu)造函數(shù)的代碼并不在子類(lèi)構(gòu)造函數(shù)中,建立對(duì)象實(shí)例時(shí)給的屬性值(即子類(lèi)構(gòu)造函數(shù)的參數(shù))并不能影響到子類(lèi)調(diào)用的父類(lèi)構(gòu)造函數(shù)。

當(dāng)然,在繼承時(shí)可以這樣寫(xiě):

Children.prototype=new Parents("Gates");//調(diào)用父類(lèi)構(gòu)造函數(shù)時(shí)給固定值

但是,這個(gè)固定的屬性值必定會(huì)影響所有子類(lèi)的對(duì)象實(shí)例,相當(dāng)于子類(lèi)構(gòu)造函數(shù)“擅作主張”給所有對(duì)象實(shí)例的屬性提前“賦了值”。這樣寫(xiě)是不太符合面向?qū)ο缶幊痰囊?guī)則的。


網(wǎng)站名稱:javascript原型鏈,原型鏈js簡(jiǎn)書(shū)
本文路徑:http://weahome.cn/article/dsigssg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部