求大神詳細的說一下JS中的原型鏈和繼承應該如何去應用,在什么樣的場景下會用到原型鏈和繼承這些東西,面試了好幾家公司,每次技術面試官問有關這方面的題,總是答不上來.求大神支招呀!
uj5u.com熱心網友回復:
平常作業中,真用不上
一般在進行js物件封裝時,可能用得到,可以讓你的物件結構更為清晰,代碼更為簡潔,便于閱讀和維護。
不過現在前端也在模塊化、組件化,封裝也成了常態,熟悉原型鏈和繼承,可能也是必須的吧。
不管怎么說,熟悉這個,說明對js作業原理理解較為深入,可以用于評估一個人的js水平。
uj5u.com熱心網友回復:
es5和es5以前的javascript版本原型鏈和原型可以用來實作繼承吧,es6+有了class語法糖和繼承的概念,我真不知道原型鏈干什么,也許指定原型鏈可以縮短物件的屬性和方法的原型鏈查找程序,優化性能,要不然參考物件的一個未定義屬性會一直順著原型鏈查找到Object上。繼承的使用場景嗎,我認為,當一個專案要針對不同的場景如用戶設備型別(是手機還是PC還是平板)寫出多個版本就能用上繼承。把一些多版本公用的屬性和方法放在一個父類里,然后其他版本繼承父類就有了父類的屬性和方法,然后在子類中寫子類獨有的屬性和方法。這樣一來代碼做到了復用,提高了開發效率,結構也更清新。
uj5u.com熱心網友回復:
我現在是理解那些簡單的基本概念,但是在平常的作業中,真的不知道去如何應用原型鏈相關的東西,實在是簡直了,不過,我看你不但理解的很到位,而且還很會應用,佩服佩服!
uj5u.com熱心網友回復:
要理解es6-的原型鏈和繼承,以及原型鏈和繼承的關系。因為es6-沒有類和繼承的概念。js實作繼承本質是把js中的物件建構式在自己的腦中抽象成一個類,然后使用建構式的protptype屬性封裝出一個類(另一個建構式),使之完美(因為js中人們總結出的實作繼承有不少,各有瑕疵)繼承前一建構式的所有屬性和方法。因為建構式能new出一個具體的物件實體,這就在js中實作了現代化的面向物件和繼承。你要理解點。
1.現代化的面向物件的基本理論,如java的面向物件的基本概念。
2.js中prototype的由來和作用。記住是弄懂,弄透。
3.理解了前面兩點,我想你對js中各種實作繼承的優劣性能輕松理解。這也就是第三點。
后語:有了es6,真有必要掌握es6-的原型鏈和實作繼承嗎?
以上只是個人見解。
uj5u.com熱心網友回復:
因為es6-沒有類和繼承的概念。js實作繼承本質是把js中的物件建構式在自己的腦中抽象成一個類,然后使用建構式的protptype屬性封裝出一個類(另一個建構式),使之完美(因為js中人們總結出的實作繼承有不少,各有瑕疵)繼承前一建構式的所有屬性和方法。因為建構式能new出一個具體的物件實體,這就在js中實作了現代化的面向物件和繼承。要理解es6-的原型鏈和繼承,以及原型鏈和繼承的關系。你要理解3點。1.現代化的面向物件的基本理論,如java的面向物件的基本概念。
2.js中prototype的由來和作用。記住是弄懂,弄透。
3.理解了前面兩點,我想你對js中各種實作繼承的優劣性能輕松理解。這也就是第三點。
后語:有了es6,真有必要掌握es6-的原型鏈和實作繼承嗎?
以上只是個人見解。
uj5u.com熱心網友回復:
因為es6-沒有類和繼承的概念。js實作繼承本質是把js中的物件建構式在自己的腦中抽象成一個類,然后使用建構式的protptype屬性封裝出一個類(另一個建構式),使之完美(因為js中人們總結出的實作繼承有不少,各有瑕疵)繼承前一建構式的所有屬性和方法。因為建構式能new出一個具體的物件實體,這就在js中實作了現代化的面向物件和繼承。要理解es6-的原型鏈和繼承,以及原型鏈和繼承的關系。你要理解3點。
1.現代化的面向物件的基本理論,如java的面向物件的基本概念。
2.js中prototype的由來和作用。記住是弄懂,弄透。
3.理解了前面兩點,我想你對js中各種實作繼承的優劣性能輕松理解。這也就是第三點。
后語:有了es6,真有必要掌握es6-的原型鏈和實作繼承嗎?
以上只是個人見解。
有必要嗎? 必要
首先。ES6的出現并不是顛覆了以往的prototype的繼承方式,它只是以往繼承方法的封裝,一種語法糖。對于喜歡學習底層技術的細心小伙伴們可能就會去看過ES6通過babel編譯后的代碼 eg:
// ES6
class A extends B {}
console.log(new A)
下面是通過babel后得到的ES5
// ES6 => babel => ES5
"use strict";
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
if (superClass) _setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
var A =
/*#__PURE__*/
function (_B) {
_inherits(A, _B);
function A() {
return _getPrototypeOf(A).apply(this, arguments);
}
return A;
}(B);
console.log(new A());
底層基礎決定上層建筑~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/124841.html
標籤:JavaScript
