javascript中的類,繼承,構造函數(shù)詳解
前言
在es5中實現(xiàn)一個構造函數(shù),并用new調(diào)用,即可得到一個類的實例。到了es6發(fā)布了Class的寫法,js的面向?qū)ο笞兂梢沧兊帽容^規(guī)范了。聊到類就不能不說類的構造函數(shù)以及類如何繼承
一、Class類
定義一個類:
class A {
constructor(name){
this.name = name
}
getName(){
return this.name
}
}
var newA = new A("A")
console.log(newA.getName()) // A
二、es5構造函數(shù)
在es5中沒有Class的寫法,想要實現(xiàn)一個類的寫法是這樣的:
class A {
constructor(name){
this.name = name
}
getName(){
return this.name
}
}
var newA = new A("A")
console.log(newA.getName()) // A
三、實例、類的關系
實例的原型指向類的原型
console.log(newA.__proto__ === A.prototype) // true
關于這個可以了解一下實例化的過程究竟發(fā)生了什么,查看MDN的連接:new操作符
- 創(chuàng)建一個空的簡單JavaScript對象(即{});
- 為步驟1新創(chuàng)建的對象添加屬性__proto__,將該屬性鏈接至構造函數(shù)的原型對象 ;
- 將步驟1新創(chuàng)建的對象作為this的上下文 ;
- 如果該函數(shù)沒有返回對象,則返回this。
Constructor
console.log(A.prototype.constructor) // Class A
所有的對象都會從原型上繼承一個constructor屬性,是對函數(shù)本身的引用,也就是說指向函數(shù)本身。
這里實例newA的原型與A的原型相等,兩者的原型的constuctor又都指向A本身。
需要注意的是constrctor是可以被修改的:參照MDN官方實例:constructor
function Type() { };
var types = [
new Array,
[],
new Boolean,
true, // remains unchanged
new Date,
new Error,
new Function,
function(){},
Math,
new Number,
1, // remains unchanged
new Object,
{},
new RegExp,
/(?:)/,
new String,
"test" // remains unchanged
];
for(var i = 0; i < types.length; i++) {
types[i].constructor = Type;
types[i] = [ types[i].constructor, types[i] instanceof Type, types[i].toString() ];
};
console.log( types.join("\n") );
只有,true、1、“test”這種只讀的原生結(jié)構不可被修改constuctor
四、繼承
es6繼承
class Father{
constructor(name){
this.name = name
}
}
class Son extends Father{
constructor(name,sname){
super(name)
this.sname = sname
}
getSon(){
return this
}
}
var newSon = new Son("f","s")
console.log(newSon.getSon()) // Son {name: 'f', sname: 's'}
es5繼承的實現(xiàn)
// 寄生組合繼承
function Sub(name){
// 優(yōu)先執(zhí)行this綁定,以免覆蓋子類的構造的值
// 這里還有一個作用是拷貝了父類屬性,避免所有子類共享引用屬性!?。。?
Person.call(this)
this.name = name || 's'
}
// 復制一份父類的原型,避免修改原型影響其他實例
var fn = function(){}
fn.prototype = Person.prototype
Sub.prototype = new fn()
var sub = new Sub('sub')
sub.showName()
// user extend.html:19
// my name is sub extend.html:21
關于繼承詳細的可以參考這篇:前端必知必會ES5、ES6的7種繼承
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
JavaScript事件概念詳解(區(qū)分靜態(tài)注冊和動態(tài)注冊)
這篇文章主要介紹了JavaScript事件(區(qū)分靜態(tài)注冊和動態(tài)注冊)的相關資料,幫助大家更好的理解和學習使用JavaScript,感興趣的朋友可以了解下2021-02-02
基于Unit PNG Fix.js有時候在ie6下不正常的解決辦法
本篇文章是對Unit PNG Fix.js有時候在ie6下不正常的解決辦法進行了詳細的分析介紹,需要的朋友參考下2013-06-06
微信小程序開發(fā)(二):頁面跳轉(zhuǎn)并傳參操作示例
這篇文章主要介紹了微信小程序開發(fā)頁面跳轉(zhuǎn)并傳參操作,結(jié)合實例形式詳細分析了微信小程序頁面跳轉(zhuǎn)并傳參相關操作技巧,需要的朋友可以參考下2020-06-06
JS 對java返回的json格式的數(shù)據(jù)處理方法
下面小編就為大家?guī)硪黄狫S 對java返回的json格式的數(shù)據(jù)處理方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
淺談類似于(function(){}).call()的js語句
這篇文章主要介紹了淺談類似于(function(){}).call()的js語句,的相關資料,需要的朋友可以參考下2015-03-03

