js原型 原型鏈

定義

原型是function對(duì)象的一個(gè)屬性它定義了構(gòu)造函數(shù)制造出的對(duì)象的公共祖先。通過該構(gòu)造函數(shù)產(chǎn)生的對(duì)象泵督,可以繼承該原型的屬性和方法趾盐。原型也是對(duì)象。

// Person.prototype     --原型
// Person.prototype={}   是祖先
Person.prototype.name='hehe'; //共有的
function Person(){
  
}
var person=new Person();//hehe
var person1=new Person();//hehe

特點(diǎn):可以繼承該原型的屬性和方法小腊。

// Person.prototype     --原型
// Person.prototype={}   是祖先
Person.prototype.height=1400; 
Person.prototype.lang=4900;
Person.prototype.carName='BMW';
function Person(color,owner){
  this.owner=owner;
  this.color=color;
}
var person=new Person('red','prof.ji'); //Person.carName='BMW'
var person1=new Person('green','laodeng');//Person.carName='BMW'


如何構(gòu)成原型鏈;
原型鏈上屬性的增刪改查
絕大多數(shù)對(duì)象的最終都會(huì)繼承自O(shè)bject.prototype
Object.create(原型)

function Person(){

}
Person.prototype
//打印出
Object{};
//里面有的屬性
constructor : Person();
__proto__ : Object;

//我們發(fā)現(xiàn)在prototype里面,他還有原型,說明原型他還有原型

原型鏈上的增刪改查和原型上的差不多,只能在自己的身上改,沒有辦法修改父級(jí)上面的…但是也不是完全不可以
最終原型

Grand.prototype.name = "shen"
function Grand(){

}
var grand = new Grand;

Father.prototype = grand;
function Father(){

}
var father = new Father;

son.prototype = father;
function son(){

}
var son = new Son();
son.name//打印出shen
//依次排查
Grand.prototype.__proto__ = object.prototype
//object.prototype最終原型

Object.create : 就是一個(gè)新的對(duì)象可以繼承一個(gè)對(duì)象的屬性救鲤,并且可以自行添加屬性

//var Obj = Object.create(原型)
var Obj = {
    name = "sunny",
    age : 123
};
var obj1 = Object.create(obj);

obj1.name//打印出sunny

添加屬性

var parents = {
     name : "wu",
     bron : "2013",
     from : "China"
 }
 var child = Object.create(
     parents,
     {
         title : {
             value : "技術(shù)分享",

         },
         year : {
             value : "18",

         }
     }
 );

特殊情況

var a = object.create(null)
//這種情況他就沒有原型

call\apply\bind
JavaScript 提供了call、apply秩冈、bind這三個(gè)方法本缠,來切換/固定this的指向。
作用,改變this指向;
區(qū)別,后面?zhèn)鞯膮?shù)不同

function Person(name,age){
    //this == obj;
    this.name = name;
    this.age = age;
}

var person = new Person("shen" 150);
var obj = {};
Person.call(obj,"wu",200);

函數(shù)實(shí)例的call方法入问,可以指定函數(shù)內(nèi)部this的指向(即函數(shù)執(zhí)行時(shí)所在的作用域)搓茬,然后在所指定的作用域中犹赖,調(diào)用該函數(shù)

var obj = {};

var f = function () {
  return this;
};

f() === window // true
f.call(obj) === obj // true

上面代碼中队他,全局環(huán)境運(yùn)行函數(shù)f時(shí)卷仑,this指向全局環(huán)境(瀏覽器為window對(duì)象);call方法可以改變this的指向麸折,指定this指向?qū)ο髈bj锡凝,然后在對(duì)象obj的作用域中運(yùn)行函數(shù)f

var n = 123;
var obj = { n: 456 };

funcion a() {
  console.log(this.n);
}

a.call() // 123
a.call(null) // 123
a.call(undefined) // 123
a.call(window) // 123
a.call(obj) // 456

上面代碼中,a函數(shù)中的this關(guān)鍵字垢啼,如果指向全局對(duì)象窜锯,返回結(jié)果為123。如果使用call方法將this關(guān)鍵字指向obj對(duì)象芭析,返回結(jié)果為456锚扎。可以看到馁启,如果call方法沒有參數(shù)驾孔,或者參數(shù)為null或undefined,則等同于指向全局對(duì)象
Function.prototype.apply()
apply方法的作用與call方法類似惯疙,也是改變this指向翠勉,然后再調(diào)用該函數(shù)。唯一的區(qū)別就是霉颠,它接收一個(gè)數(shù)組作為函數(shù)執(zhí)行時(shí)的參數(shù)对碌,使用格式如下。

func.apply(thisValue, [arg1, arg2, ...])

apply方法的第一個(gè)參數(shù)也是this所要指向的那個(gè)對(duì)象蒿偎,如果設(shè)為null或undefined朽们,則等同于指定全局對(duì)象。第二個(gè)參數(shù)則是一個(gè)數(shù)組诉位,該數(shù)組的所有成員依次作為參數(shù)骑脱,傳入原函數(shù)。原函數(shù)的參數(shù)不从,在call方法中必須一個(gè)個(gè)添加惜姐,但是在apply方法中琴拧,必須以數(shù)組形式添加

function f(x, y){
  console.log(x + y);
}

f.call(null, 1, 1) // 2
f.apply(null, [1, 1]) // 2

上面代碼中屈溉,f函數(shù)本來接受兩個(gè)參數(shù)典奉,使用apply方法以后最爬,就變成可以接受一個(gè)數(shù)組作為參數(shù)
Function.prototype.bind()
bind方法用于將函數(shù)體內(nèi)的this綁定到某個(gè)對(duì)象肚医,然后返回一個(gè)新函數(shù)

var d = new Date();
d.getTime() // 1481869925657

var print = d.getTime;
print() // Uncaught TypeError: this is not a Date object.

上面代碼中匙奴,我們將d.getTime方法賦給變量print叙赚,然后調(diào)用print就報(bào)錯(cuò)了怨咪。這是因?yàn)間etTime方法內(nèi)部的this乏矾,綁定Date對(duì)象的實(shí)例孟抗,賦給變量print以后迁杨,內(nèi)部的this已經(jīng)不指向Date對(duì)象的實(shí)例了
bind方法可以解決這個(gè)問題。

var print = d.getTime.bind(d);
print() // 1481869925657

上面代碼中凄硼,bind方法將getTime方法內(nèi)部的this綁定到d對(duì)象铅协,這時(shí)就可以安全地將這個(gè)方法賦值給其他變量了。
bind方法的參數(shù)就是所要綁定this的對(duì)象摊沉,下面是一個(gè)更清晰的例子狐史。

var counter = {
  count: 0,
  inc: function () {
    this.count++;
  }
};

var func = counter.inc.bind(counter);
func();

上面代碼中,counter.inc方法被賦值給變量func说墨。這時(shí)必須用bind方法將inc內(nèi)部的this骏全,綁定到counter,否則就會(huì)出錯(cuò)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尼斧,一起剝皮案震驚了整個(gè)濱河市姜贡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棺棵,老刑警劉巖楼咳,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異律秃,居然都是意外死亡爬橡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門棒动,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糙申,“玉大人,你說我怎么就攤上這事船惨」衤悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵粱锐,是天一觀的道長疙挺。 經(jīng)常有香客問我,道長怜浅,這世上最難降的妖魔是什么铐然? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮恶座,結(jié)果婚禮上搀暑,老公的妹妹穿的比我還像新娘。我一直安慰自己跨琳,他們只是感情好自点,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脉让,像睡著了一般桂敛。 火紅的嫁衣襯著肌膚如雪功炮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天术唬,我揣著相機(jī)與錄音薪伏,去河邊找鬼。 笑死碴开,一個(gè)胖子當(dāng)著我的面吹牛毅该,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播潦牛,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼挡育!你這毒婦竟也來了巴碗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤即寒,失蹤者是張志新(化名)和其女友劉穎橡淆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體母赵,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逸爵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凹嘲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片师倔。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖周蹭,靈堂內(nèi)的尸體忽然破棺而出趋艘,到底是詐尸還是另有隱情,我是刑警寧澤凶朗,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布瓷胧,位于F島的核電站,受9級(jí)特大地震影響棚愤,放射性物質(zhì)發(fā)生泄漏搓萧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一宛畦、第九天 我趴在偏房一處隱蔽的房頂上張望瘸洛。 院中可真熱鬧,春花似錦刃永、人聲如沸货矮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囚玫。三九已至喧锦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抓督,已是汗流浹背燃少。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铃在,地道東北人阵具。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像定铜,于是被迫代替她去往敵國和親阳液。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 定義 原型是function對(duì)象的一個(gè)屬性它定義了構(gòu)造函數(shù)制造出的對(duì)象的公共祖先揣炕。通過該構(gòu)造函數(shù)產(chǎn)生的對(duì)象帘皿,可以繼...
    小老虎丶冷心閱讀 338評(píng)論 0 0
  • 原型 簡單創(chuàng)建一個(gè)構(gòu)造函數(shù)與實(shí)例: Person 構(gòu)造函數(shù)person 是 Person 的一個(gè)實(shí)例對(duì)象 inst...
    月光在心中閱讀 650評(píng)論 0 5
  • 函數(shù)和對(duì)象 1丁恭、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語言來說都是核心的概念曹动。通過函數(shù)可以封裝任意多條語句,而且...
    道無虛閱讀 4,543評(píng)論 0 5
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,104評(píng)論 0 21
  • 于千千萬萬人中遇見牲览,于千千萬萬人中愛上墓陈,這微乎其微的概率并不是無中生有的,它早有安排竭恬,它可能從我們相遇的時(shí)候就開...
    養(yǎng)人閱讀 140評(píng)論 0 0