最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript中的Prototype到底是什么

 更新時(shí)間:2016年02月16日 16:52:24   作者:Darren Ji  
Javascript也是面向?qū)ο蟮恼Z言,但它是一種基于原型Prototype的語言,而不是基于類的語言。接下來通過本文給大家介紹Javascript中的Prototype到底是啥的相關(guān)知識(shí),感興趣的朋友參考下

Javascript也是面向?qū)ο蟮恼Z言,但它是一種基于原型Prototype的語言,而不是基于類的語言。在Javascript中,類和對(duì)象看起來沒有太多的區(qū)別。

什么是prototype:

function定義的對(duì)象有一個(gè)prototype屬性,prototype屬性又指向了一個(gè)prototype對(duì)象,注意prototype屬性與prototype對(duì)象是兩個(gè)不同的東西,要注意區(qū)別。在prototype對(duì)象中又有一個(gè)constructor屬性,這個(gè)constructor屬性同樣指向一個(gè)constructor對(duì)象,而這個(gè)constructor對(duì)象恰恰就是這個(gè)function函數(shù)本身。 是不是很繞?用偽代碼表示如下:

var function{
prototype:prototype{
constructor:constructor == function
}
}

還不明白?看圖吧:


prototype的作用:

這個(gè)prototype到底有什么作用呢?看下面的例子:

function jb51(){
}
jb51.prototype.name = "a";
var test = new jb51();
alert(test.name)//"a";

奇怪吧,明明沒有為test設(shè)置name屬性,可是為什么會(huì)有值?

這就是prototype的功勞了,uw3c中prototype屬性中的name對(duì)象,在uw3c被new構(gòu)造函數(shù)之后,被繼承到了對(duì)象test的屬性中。接著看:

var name = "js";
function jb51(name){
alert(this.name);//"css"
}
jb51.prototype.name = "css";
var test = new jb51();
test()

為什么alert的值不是“js”?這個(gè)過程大致如下:

var test={};
uw3c.call(test);

第一步是建立一個(gè)新對(duì)象(test)。

第二步將該對(duì)象(test)內(nèi)置的原型對(duì)象設(shè)置為構(gòu)造函數(shù)(就是uw3c)prototype 屬性引用的那個(gè)原型對(duì)象。

第三步就是將該對(duì)象(test)作為this 參數(shù)調(diào)用構(gòu)造函數(shù)(就是uw3c),完成成員設(shè)置等初始化工作。

其中第二步中出現(xiàn)了一個(gè)新名詞就是內(nèi)置的原型對(duì)象,注意這個(gè)新名詞跟prototype對(duì)象不是一回事, 為了區(qū)別我叫它inobj,inobj就指向了函數(shù)uw3c的prototype對(duì)象。在uw3c的prototype對(duì)象中出現(xiàn)的任何屬性或者函數(shù)都可以在test對(duì)象中直接使用,這個(gè)就是JS中的原型繼承了。

通常,這樣創(chuàng)建一個(gè)對(duì)象:

function person(name){
this.sayHi = function(){
alert('hi ' + this.name);
}
this.name = name;
}
var p = new person("dan");
p.sayHi(); 

以上,使用new關(guān)鍵字,通過對(duì)象(函數(shù)也是特殊對(duì)象)創(chuàng)建一個(gè)對(duì)象實(shí)例。

在基于類的語言中,屬性或字段通常都是在類中事先定義好了,但在Javascript中,在創(chuàng)建對(duì)象之后還可以為類添加字段。

function animal(){}
var cat = new animal();
cat.color = "green"; 

以上,color這個(gè)字段只屬于當(dāng)前的cat實(shí)例。
對(duì)于后加的字段,如果想讓animal的所有實(shí)例都擁有呢?

--使用Prototype
function animal(){}
animal.prototype.color= "green";
var cat = new animal();
var dog = new animal();
console.log(cat.color);//green
console.log(dog.color);//green 

通過Prototype不僅可以添加字段,還可以添加方法。

function animal(){}
animal.prototype.color= "green";
var cat = new animal();
var dog = new animal();
console.log(cat.color);//green
console.log(dog.color);//green
animal.prototype.run = funciton(){
console.log("run");
}
dog.run(); 

原來通過prototype屬性,在創(chuàng)建對(duì)象之后還可以改變對(duì)象的行為。
比如,可以為數(shù)組這個(gè)特殊對(duì)象添加一個(gè)方法。

Array.prototype.remove = function(elem){
var index = this.indexof(elem);
if(index >= 0){
this.splice(index, 1);
}
}
var arr = [1, 2, 3] ;
arr.remove(2); 

除了通過prototype為對(duì)象定義屬性或方法,還可以通過對(duì)象的構(gòu)造函數(shù)來定義類的屬性或方法。

function animal(){
this.color = "green";
this.run = function(){
console.log("run");
}
}
var mouse = new animal();
mouse.run(); 

以上做法的也可以讓所有的animal實(shí)例共享所有的字段和方法。并且還有一個(gè)好處是可以在構(gòu)造函數(shù)中使用類的局部變量。

function animal(){
var runAlready = false;
this.color = "green";
this.run = funciton(){
if(!runAlreadh){
console.log("start running");
} else {
console.log("already running")
}
}
} 

其實(shí),一個(gè)更加實(shí)際的做法是把通過構(gòu)造函數(shù)結(jié)合通過prototype定義一個(gè)類的字段和行為。

function animal(){
var runAlready = false;
this.run = function(){
if(!runAlready){
console.log('i am running');
} else {
console.log("i am already running");
}
}
}
animal.prototype.color = '';
animal.prototype.hide = funciton(){
console.log("");
}
var horse = new animal();
horse.run();
horse.hide(); 

Prototype允許我們?cè)趧?chuàng)建對(duì)象之后來改變對(duì)象或類的行為,并且這些通過prototype屬性添加的字段或方法所有對(duì)象實(shí)例是共享的。

相關(guān)文章

  • JavaScript實(shí)現(xiàn)網(wǎng)頁對(duì)象拖放功能的方法

    JavaScript實(shí)現(xiàn)網(wǎng)頁對(duì)象拖放功能的方法

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁對(duì)象拖放功能的方法,涉及javascript針對(duì)瀏覽器的判斷、事件愛你的添加與移除等相關(guān)操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • JavaScript實(shí)現(xiàn)可拖動(dòng)模態(tài)框

    JavaScript實(shí)現(xiàn)可拖動(dòng)模態(tài)框

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)可拖動(dòng)模態(tài)框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 理解JavaScript的prototype屬性

    理解JavaScript的prototype屬性

    JavaScript可以說是最讓人初學(xué)者難以理解的單一屬性。我看了一些資料后,開始明白其實(shí)這些困難很大程度來自prototype這個(gè)名字本身的二義性
    2012-02-02
  • 來自chinaz的ajax獲取評(píng)論代碼

    來自chinaz的ajax獲取評(píng)論代碼

    chinaz利用了ajax實(shí)現(xiàn)評(píng)論的讀取操作,下面我們參考chinaz的代碼
    2008-05-05
  • js將圖片轉(zhuǎn)base64的兩種實(shí)現(xiàn)方法

    js將圖片轉(zhuǎn)base64的兩種實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于js將圖片轉(zhuǎn)base64的兩種實(shí)現(xiàn)方法,Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法,需要的朋友可以參考下
    2023-07-07
  • JS開發(fā)接入?deepseek?實(shí)現(xiàn)AI智能問診

    JS開發(fā)接入?deepseek?實(shí)現(xiàn)AI智能問診

    本文介紹了如何使用DeepSeek?API在UniApp項(xiàng)目中實(shí)現(xiàn)智能問診功能,代碼示例展示了如何構(gòu)建請(qǐng)求并處理響應(yīng),本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-02-02
  • 理解javascript中Map代替循環(huán)

    理解javascript中Map代替循環(huán)

    這篇文章主要幫助大家理解javascript中Map代替循環(huán),感興趣的小伙伴們可以參考一下
    2016-02-02
  • uni-app實(shí)現(xiàn)熱更新的詳細(xì)操作步驟

    uni-app實(shí)現(xiàn)熱更新的詳細(xì)操作步驟

    隨著 App 成功上架,可能更新頻率往往會(huì)越來越高,傳統(tǒng)的應(yīng)用更新方式要求用戶重新下載并安裝應(yīng)用,這不僅耗費(fèi)用戶大量時(shí)間、流量,還嚴(yán)重影響用戶體驗(yàn),為了提升用戶體驗(yàn),熱更新技術(shù)應(yīng)運(yùn)而生,所以本文介紹了uni-app實(shí)現(xiàn)熱更新的詳細(xì)操作步驟,需要的朋友可以參考下
    2025-04-04
  • EasyUi combotree 實(shí)現(xiàn)動(dòng)態(tài)加載樹節(jié)點(diǎn)

    EasyUi combotree 實(shí)現(xiàn)動(dòng)態(tài)加載樹節(jié)點(diǎn)

    這篇文章主要介紹了EasyUi combotree 實(shí)現(xiàn)動(dòng)態(tài)加載樹節(jié)點(diǎn)的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • headjs實(shí)現(xiàn)網(wǎng)站并行加載但順序執(zhí)行JS

    headjs實(shí)現(xiàn)網(wǎng)站并行加載但順序執(zhí)行JS

    本文主要介紹如何使用head.js實(shí)現(xiàn)網(wǎng)站并行加載但順序執(zhí)行JS,提高網(wǎng)站加載速度。需要的朋友可以看下
    2016-11-11

最新評(píng)論

乌海市| 喀喇沁旗| 延长县| 当雄县| 汽车| 清徐县| 池州市| 木兰县| 德安县| 大厂| 陆川县| 景德镇市| 含山县| 兰坪| 依兰县| 乌鲁木齐县| 榕江县| 土默特左旗| 重庆市| 常德市| 抚宁县| 南丰县| 巴塘县| 长乐市| 漳州市| 安宁市| 田东县| 安岳县| 牟定县| 民丰县| 楚雄市| 南汇区| 柘城县| 榆社县| 迁西县| 岳池县| 古田县| 礼泉县| 龙里县| 克什克腾旗| 奈曼旗|