原型鏈和麵向物件
阿新 • • 發佈:2018-12-08
1.建立物件有幾種方法
// 物件字面量
var o1 = {name:'o1'}
var o11 = new Object({name:'011'})
// 建構函式
var M = new Function(){this.name=m}
var m =new M()
// 用物件的原型建立
var P={name:'o3'}
var o3 = Object.create(P)
2.原型鏈
3. instanceof 原理
- 例項物件的proto 和建構函式的protoType 是否是同一個引用
4.類的宣告
//類的宣告
function Animal (name) {
this.name = name;
}
// es6
class Animal2 {
constructor () {
this.name = 'a'
}
}
//例項化
new Animal('ss');
new Animal2();
5. 類的繼承方式
/*
* 藉助建構函式實現繼承
* 缺點:Parent1原型物件上的屬性和方法 不能被繼承
* */
function Parent1 () {
this.name = 'parent1'
}
function Child1 () {
Parent1.call(this)// 將父級建構函式this 指向子類建構函式
this.type = 'child1'
}
console.log(new Child1())
/*
* 藉助原型鏈繼承
* 缺點:父類屬性和方法修改,子類不同例項的屬性或方法會一起修改
* */
function Parent2 () {
this.name = 'parent1'
}
function Child2 () {
this.type = 'child1'
}
Child2.prototype = new Parent2();
/*
* 組合方式
* 缺點:父級的建構函式執行了兩次
* */
function Parent3 () {
this.name = 'parent1'
}
function Child3 () {
Parent3.call(this)
this.type = 'child1'
}
Child3.prototype=new Parent3()
/*
* 組合繼承的優化1
* 缺點:子類constructor指向出現錯誤
* */
function Parent4 () {
this.name = 'parent1'
}
function Child4 () {
Parent4.call(this)
this.type = 'child1'
}
Child4.prototype=Parent4.prototype
/*
* 組合繼承的優化2
*
* */
function Parent5 () {
this.name = 'parent1'
}
function Child5 () {
Parent5.call(this)
this.type = 'child1'
}
Child5.prototype=Object.create(Parent5.prototype)
Child5.prototype.constructor=Child5