<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
眾所周知,在ES6
之前,前端是不存在類的語法糖,所以不能像其他語言一樣用extends
關鍵字就搞定繼承關係,需要一些額外的方法來實現繼承。下面就介紹一些常用的方法,紅寶書已經概括的十分全面了,所以本文基本就是對紅寶書繼承篇章的筆記和梳理。
function Parent() { this.name = 'arzh' } Parent.prototype.getName = function () { console.log(this.name) } function Child() { } //主要精髓所在 Child.prototype = new Parent() Child.prototype.constructor = Child var arzhChild = new Child() arzhChild.getName() // 'arzh'
原型鏈繼承缺點:
1.每個範例對參照型別屬性的修改都會被其他的範例共用
function Parent() { this.names = ['arzh','arzh1']; } function Child() { } //主要精髓所在 Child.prototype = new Parent() Child.prototype.constructor = Child var arzhChild2 = new Child() arzhChild2.names.push('arzh2') console.log(arzhChild2.names) //[ 'arzh', 'arzh1', 'arzh2' ] var arzhChild3 = new Child() arzhChild3.names.push('arzh3') console.log(arzhChild3.names) //[ 'arzh', 'arzh1', 'arzh2', 'arzh3' ]
2.在建立Child
範例的時候,無法向Parent
傳參。這樣就會使Child
範例沒法自定義自己的屬性(名字)
function Parent() { this.names = ['arzh','arzh1'] } function Child() { Parent.call(this) } var arzhChild2 = new Child() arzhChild2.names.push('arzh2') console.log(arzhChild2.names) //[ 'arzh', 'arzh1', 'arzh2' ] var arzhChild3 = new Child() arzhChild3.names.push('arzh3') console.log(arzhChild3.names) //[ 'arzh', 'arzh1', 'arzh3' ]
優點:
function Parent(name) { this.name = name } function Child(name) { Parent.call(this, name) } var arzhChild = new Child('arzh'); console.log(arzhChild.name); // arzh var arzhChild1 = new Child('arzh1'); console.log(arzhChild1.name); // arzh1
缺點:
function Parent(name) { this.name = name this.body = ['foot','hand'] } function Child(name, age) { Parent.call(this, name) this.age = age } Child.prototype = new Parent() Child.prototype.constructor = Child var arzhChild1 = new Child('arzh1', '18') arzhChild1.body.push('head1') console.log(arzhChild1.name,arzhChild1.age) //arzh1 18 console.log(arzhChild1.body) //[ 'foot', 'hand', 'head1' ] var arzhChild2 = new Child('arzh2', '20') arzhChild2.body.push('head2') console.log(arzhChild2.name,arzhChild2.age) //arzh2 20 console.log(arzhChild2.body) //[ 'foot', 'hand', 'head2' ]
優點:
缺點:
Child.prototype = new Parent()
,第二次是Parent.call(this, name)
造成不必要的浪費複製傳入的物件到建立物件的原型上,從而實現繼承
function createObj(o) { function F(){} F.prototype = o; return new F(); } var person = { name : 'arzh', body : ['foot','hand'] } var person1 = createObj(person) var person2 = createObj(person) console.log(person1) //arzh person1.body.push('head') console.log(person2) //[ 'foot', 'hand', 'head' ]
缺點: 同原型鏈繼承一樣,每個範例對參照型別屬性的修改都會被其他的範例共用
我們可以使用Object.create
來代替上述createObj
的實現,原理基本上是一樣的。寄生式繼承其實就是在createObj
的內部以某種形式來增強物件(這裡的增強可以理解為新增物件的方法),最後返回增強之後的物件。
function createEnhanceObj(o) { //代替原型式繼承的createObj var clone = Object.create(o) clone.getName = function () { console.log('arzh') } return clone; }
通過createEnhanceObj
就可以在建立物件的時候,把物件方法也通過此種方式繼承。
缺點: 同借用建構函式一樣,無法複用父類別函數,每次建立物件都會建立一遍方法
不需要為了子類的原型而多new
了一次父類別的建構函式,如Child.prototype = new Parent()
只需要複製父類別原型的一個副本給子類原型即可
function inheritPrototype(Parent, Child){ Child.prototype = Object.create(Parent.prototype) //建立父類別原型的一個副本,把副本賦值給子類原型 Child.prototype.constructor = Child; } function Parent(name) { this.name = name } Parent.prototype.getName = function () { console.log(this.name) } function Child(color) { Parent.call(this, 'arzh') this.color = color } inheritPrototype(Parent, Child) var arzhChild = new Child('red') console.log(arzhChild.name) // 'arzh'
優點: 不必為了指定子型別的原型而呼叫父類別型的建構函式
ES6
支援通過類來實現繼承,方法比較簡單,程式碼如下
class Point { constructor(x, y) { this.x = x this.y = y } toString() { return this.x + '' + this.y } } class ColorPoint extends Point { constructor(x, y, color) { super(x, y) //呼叫父類別的constructor(x, y) this.color = color } toString() { return this.color + ' ' + super.toString() // 呼叫父類別的toString() } } var colorPoint = new ColorPoint('1', '2', 'red') console.log(colorPoint.toString()) // red 12
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45