一起來了解JavaScript面向?qū)ο?/h1>
更新時(shí)間:2021年09月26日 16:33:41 作者:還是不會呀
本篇文章主要介紹了Javascript的面向?qū)ο螅【幱X得這篇文章內(nèi)容很不錯(cuò),需要的朋友可以看下,希望能夠給你帶來幫助
JavaScript原型鏈
每一個(gè)對象都有原型,指向另一個(gè)對象,另一個(gè)對象也有自己的原型,就這樣由原型的原型構(gòu)成的鏈條就叫原型鏈。

原型鏈的盡頭
如果一個(gè)原型鏈?zhǔn)?,沒用盡頭的,那么在查找一原型鏈上不存在的屬性時(shí),就會一直查找下去,存在死循環(huán)了。顯然不是這樣的,那么原型鏈的盡頭是什么?
Object的原型
頂層原型
看代碼~
// obj字面量創(chuàng)建方法類似于 new Object()
// 那么 obj對象就是Object的一個(gè)實(shí)例,也就是說obj.__proto__ === Object.prototype
var obj = {
name: "fzb",
};
// 那么obj.__proto__ 或者 Oject.prototype 的__proto__ 是什么? 答案是: null
console.log(obj.__proto__); // [Object: null prototype] {}
console.log(obj.__proto__.__proto__); // null
[Object: null prototype] {}的特殊之處:
1、該對象存在原型屬性,只是原型指向了null,就是已經(jīng)是頂層原型了。
2、該對象上還存在許多其他的方法,只是不可枚舉,看不到。
創(chuàng)建Object對象的內(nèi)存圖

上方例子的內(nèi)存圖

Object是所有類的父類
原型鏈最頂層的原型對象就是Object的原型對象
例子:
function Student(sno, name) {
this.sno = sno;
this.name = name;
}
const stu = new Student(201801, "fzb");
console.log(stu); // Student { sno: 201801, name: 'fzb' }
console.log(stu.__proto__); // {}
console.log(stu.__proto__.__proto__); // [Object: null prototype] {}
console.log(Student.__proto__); // {}
/* ***************后面將具體講解注釋內(nèi)容***************
* 為什么不是 Student.__proto__ = [Object: null prototype] {}
* 是因?yàn)?Student.__proto__ = Function.prototype
* Function.prototype.__proto__ = Object.prototype = [Object: null prototype] {}
* ***************后面將具體講解注釋內(nèi)容***************
*/
console.log(Student.__proto__.__proto__); // [Object: null prototype] {}
內(nèi)存圖:

原型鏈實(shí)現(xiàn)繼承
繼承可以重復(fù)利用代碼,子類可以使用
例子:
function Person() {
this.name = "fzb";
}
Person.prototype.running = function () {
console.log(this.name + "正在跑步~");
};
function Student(sno) {
this.sno = sno;
}
Student.prototype = new Person();
// 重寫整個(gè)原型對象之后,要重新配置 constructor
Object.defineProperty(Student.prototype, "constructor", {
configurable: true,
enumerable: false,
writable: true,
value: Student,
});
Student.prototype.studying = function () {
console.log(this.name + "正在學(xué)習(xí)");
};
const stu = new Student(201801);
stu.running(); // fzb正在跑步~
stu.studying(); // fzb正在學(xué)習(xí)
內(nèi)存圖:

缺陷
1> 在打印子類對象時(shí),有些屬性本應(yīng)該打印出來的,但是因?yàn)樵诟割惿?,無法打印出來。
2> 多個(gè)子類對象在進(jìn)行某些操作時(shí),會出現(xiàn)相互影響。
// 在上方例子上,加一點(diǎn)點(diǎn)代碼,
function Person() {
this.name = "fzb";
this.friends = []; // 增加一個(gè)屬性
}
const stu1 = new Student(201801);
stu1.friends.push("zzw");
const stu2 = new Student(201801);
console.log(stu2.friends); // [ 'zzw' ]
// stu2上取到了stu1的friends屬性,這是不可以的
3> 無法傳遞參數(shù),有些屬性存在父類構(gòu)造函數(shù)內(nèi),子類實(shí)例化時(shí),初始化參數(shù)無法傳入到父類。
借用構(gòu)造函數(shù)實(shí)現(xiàn)繼承
在子類構(gòu)造函數(shù)內(nèi),調(diào)用構(gòu)造函數(shù)。使改變父類構(gòu)造函數(shù)內(nèi)的this指向,然后父類在this上添加的屬性就會在子類實(shí)例化的對象上。
function Person(name) {
this.name = name;
this.friends = [];
}
Person.prototype.running = function () {
console.log(this.name + "正在跑步~");
};
function Student(sno, name) {
Person.call(this, name); // 添加代碼
this.sno = sno;
}
Student.prototype = new Person();
// 重寫整個(gè)原型對象之后,要重新配置 constructor
Object.defineProperty(Student.prototype, "constructor", {
configurable: true,
enumerable: false,
writable: true,
value: Student,
});
Student.prototype.studying = function () {
console.log(this.name + "正在學(xué)習(xí)");
};
const stu1 = new Student(201801,"stu1");
stu1.friends.push("zzw");
const stu2 = new Student(201802,"stu2");
console.log(stu2.friends); // []
這時(shí)原型鏈實(shí)現(xiàn)繼承的三個(gè)弊端,就解決的。但是又出現(xiàn)了新的缺陷。
缺陷
1> 父類構(gòu)造函數(shù)至少執(zhí)行了兩次以上
2> 子類構(gòu)造函數(shù)的原型對象是父類的實(shí)例對象,那么個(gè)對象上的屬性將會是undefined

總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
-
request請求獲取參數(shù)的實(shí)現(xiàn)方法(post和get兩種方式)
下面小編就為大家?guī)硪黄猺equest請求獲取參數(shù)的實(shí)現(xiàn)方法(post和get兩種方式)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧 2016-09-09
-
javascript parseUrl函數(shù)(來自國外的獲取網(wǎng)址url參數(shù))
在外國一博客看到一個(gè)很好的函數(shù),獲取網(wǎng)址url等地址參數(shù)。非常不錯(cuò),值得參考與收藏。 2010-06-06
-
基于JavaScript實(shí)現(xiàn)在線網(wǎng)頁煙花效果
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)簡單的在線網(wǎng)頁煙花效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下 2023-02-02
-
詳解照片瀑布流效果(js,jquery分別實(shí)現(xiàn)與知識點(diǎn)總結(jié))
本篇文章主要介紹了照片瀑布流效果,實(shí)現(xiàn)圖片自動加載的瀑布流效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
2017-01-01
-
微信小程序wx.getImageInfo()如何獲取圖片信息
這篇文章主要為大家詳細(xì)介紹了微信小程序wx.getImageInfo()如何獲取圖片信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2018-01-01
-
關(guān)于動態(tài)執(zhí)行代碼(js的Eval)實(shí)例詳解
下面小編就為大家?guī)硪黄P(guān)于動態(tài)執(zhí)行代碼(js的Eval)實(shí)例詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧 2016-08-08
-
深入淺出JavaScript前端中的設(shè)計(jì)模式
這篇文章主要介紹了JavaScript前端中的設(shè)計(jì)模式,設(shè)計(jì)模式是一套被反復(fù)使用,多數(shù)人知曉的,經(jīng)過分類編目的,代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),感興趣想要詳細(xì)了解可以參考下文 2023-05-05
-
Javascript實(shí)現(xiàn)可旋轉(zhuǎn)的圓圈實(shí)例代碼
這篇文章主要介紹了Javascript實(shí)現(xiàn)可旋轉(zhuǎn)的圓圈實(shí)例代碼,可實(shí)現(xiàn)圓圈的旋轉(zhuǎn)與運(yùn)動效果,涉及javascript動態(tài)操作頁面元素屬性及進(jìn)行相應(yīng)數(shù)學(xué)運(yùn)算的技巧,需要的朋友可以參考下 2015-08-08
最新評論
JavaScript原型鏈
每一個(gè)對象都有原型,指向另一個(gè)對象,另一個(gè)對象也有自己的原型,就這樣由原型的原型構(gòu)成的鏈條就叫原型鏈。

原型鏈的盡頭
如果一個(gè)原型鏈?zhǔn)?,沒用盡頭的,那么在查找一原型鏈上不存在的屬性時(shí),就會一直查找下去,存在死循環(huán)了。顯然不是這樣的,那么原型鏈的盡頭是什么?
Object的原型
頂層原型
看代碼~
// obj字面量創(chuàng)建方法類似于 new Object()
// 那么 obj對象就是Object的一個(gè)實(shí)例,也就是說obj.__proto__ === Object.prototype
var obj = {
name: "fzb",
};
// 那么obj.__proto__ 或者 Oject.prototype 的__proto__ 是什么? 答案是: null
console.log(obj.__proto__); // [Object: null prototype] {}
console.log(obj.__proto__.__proto__); // null
[Object: null prototype] {}的特殊之處:
1、該對象存在原型屬性,只是原型指向了null,就是已經(jīng)是頂層原型了。
2、該對象上還存在許多其他的方法,只是不可枚舉,看不到。
創(chuàng)建Object對象的內(nèi)存圖

上方例子的內(nèi)存圖

Object是所有類的父類
原型鏈最頂層的原型對象就是Object的原型對象
例子:
function Student(sno, name) {
this.sno = sno;
this.name = name;
}
const stu = new Student(201801, "fzb");
console.log(stu); // Student { sno: 201801, name: 'fzb' }
console.log(stu.__proto__); // {}
console.log(stu.__proto__.__proto__); // [Object: null prototype] {}
console.log(Student.__proto__); // {}
/* ***************后面將具體講解注釋內(nèi)容***************
* 為什么不是 Student.__proto__ = [Object: null prototype] {}
* 是因?yàn)?Student.__proto__ = Function.prototype
* Function.prototype.__proto__ = Object.prototype = [Object: null prototype] {}
* ***************后面將具體講解注釋內(nèi)容***************
*/
console.log(Student.__proto__.__proto__); // [Object: null prototype] {}
內(nèi)存圖:

原型鏈實(shí)現(xiàn)繼承
繼承可以重復(fù)利用代碼,子類可以使用
例子:
function Person() {
this.name = "fzb";
}
Person.prototype.running = function () {
console.log(this.name + "正在跑步~");
};
function Student(sno) {
this.sno = sno;
}
Student.prototype = new Person();
// 重寫整個(gè)原型對象之后,要重新配置 constructor
Object.defineProperty(Student.prototype, "constructor", {
configurable: true,
enumerable: false,
writable: true,
value: Student,
});
Student.prototype.studying = function () {
console.log(this.name + "正在學(xué)習(xí)");
};
const stu = new Student(201801);
stu.running(); // fzb正在跑步~
stu.studying(); // fzb正在學(xué)習(xí)
內(nèi)存圖:

缺陷
1> 在打印子類對象時(shí),有些屬性本應(yīng)該打印出來的,但是因?yàn)樵诟割惿?,無法打印出來。
2> 多個(gè)子類對象在進(jìn)行某些操作時(shí),會出現(xiàn)相互影響。
// 在上方例子上,加一點(diǎn)點(diǎn)代碼,
function Person() {
this.name = "fzb";
this.friends = []; // 增加一個(gè)屬性
}
const stu1 = new Student(201801);
stu1.friends.push("zzw");
const stu2 = new Student(201801);
console.log(stu2.friends); // [ 'zzw' ]
// stu2上取到了stu1的friends屬性,這是不可以的
3> 無法傳遞參數(shù),有些屬性存在父類構(gòu)造函數(shù)內(nèi),子類實(shí)例化時(shí),初始化參數(shù)無法傳入到父類。
借用構(gòu)造函數(shù)實(shí)現(xiàn)繼承
在子類構(gòu)造函數(shù)內(nèi),調(diào)用構(gòu)造函數(shù)。使改變父類構(gòu)造函數(shù)內(nèi)的this指向,然后父類在this上添加的屬性就會在子類實(shí)例化的對象上。
function Person(name) {
this.name = name;
this.friends = [];
}
Person.prototype.running = function () {
console.log(this.name + "正在跑步~");
};
function Student(sno, name) {
Person.call(this, name); // 添加代碼
this.sno = sno;
}
Student.prototype = new Person();
// 重寫整個(gè)原型對象之后,要重新配置 constructor
Object.defineProperty(Student.prototype, "constructor", {
configurable: true,
enumerable: false,
writable: true,
value: Student,
});
Student.prototype.studying = function () {
console.log(this.name + "正在學(xué)習(xí)");
};
const stu1 = new Student(201801,"stu1");
stu1.friends.push("zzw");
const stu2 = new Student(201802,"stu2");
console.log(stu2.friends); // []
這時(shí)原型鏈實(shí)現(xiàn)繼承的三個(gè)弊端,就解決的。但是又出現(xiàn)了新的缺陷。
缺陷
1> 父類構(gòu)造函數(shù)至少執(zhí)行了兩次以上
2> 子類構(gòu)造函數(shù)的原型對象是父類的實(shí)例對象,那么個(gè)對象上的屬性將會是undefined

總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
request請求獲取參數(shù)的實(shí)現(xiàn)方法(post和get兩種方式)
下面小編就為大家?guī)硪黄猺equest請求獲取參數(shù)的實(shí)現(xiàn)方法(post和get兩種方式)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
javascript parseUrl函數(shù)(來自國外的獲取網(wǎng)址url參數(shù))
在外國一博客看到一個(gè)很好的函數(shù),獲取網(wǎng)址url等地址參數(shù)。非常不錯(cuò),值得參考與收藏。2010-06-06
基于JavaScript實(shí)現(xiàn)在線網(wǎng)頁煙花效果
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)簡單的在線網(wǎng)頁煙花效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02
詳解照片瀑布流效果(js,jquery分別實(shí)現(xiàn)與知識點(diǎn)總結(jié))
本篇文章主要介紹了照片瀑布流效果,實(shí)現(xiàn)圖片自動加載的瀑布流效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01
微信小程序wx.getImageInfo()如何獲取圖片信息
這篇文章主要為大家詳細(xì)介紹了微信小程序wx.getImageInfo()如何獲取圖片信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
關(guān)于動態(tài)執(zhí)行代碼(js的Eval)實(shí)例詳解
下面小編就為大家?guī)硪黄P(guān)于動態(tài)執(zhí)行代碼(js的Eval)實(shí)例詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
深入淺出JavaScript前端中的設(shè)計(jì)模式
這篇文章主要介紹了JavaScript前端中的設(shè)計(jì)模式,設(shè)計(jì)模式是一套被反復(fù)使用,多數(shù)人知曉的,經(jīng)過分類編目的,代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),感興趣想要詳細(xì)了解可以參考下文2023-05-05
Javascript實(shí)現(xiàn)可旋轉(zhuǎn)的圓圈實(shí)例代碼
這篇文章主要介紹了Javascript實(shí)現(xiàn)可旋轉(zhuǎn)的圓圈實(shí)例代碼,可實(shí)現(xiàn)圓圈的旋轉(zhuǎn)與運(yùn)動效果,涉及javascript動態(tài)操作頁面元素屬性及進(jìn)行相應(yīng)數(shù)學(xué)運(yùn)算的技巧,需要的朋友可以參考下2015-08-08

