JS 對(duì)象創(chuàng)建的三種方式
字面量創(chuàng)建方式
var person ={
name: 'Tom'
}
系統(tǒng)內(nèi)置構(gòu)造函數(shù)方式
var person = new Object()
person.name = 'Tom'
自定義構(gòu)造函數(shù)
function Person(name){
this.name = name;
}
var person = new Person('Tom');
繼承方式
for in 繼承
function Person () {
this.name = 'Tom'
this.age = 25
}
function Son () {}
var p = new Person()
var s = new Son()
for (var k in p) {
s[k] = p[k]
}
console.log(s.name) // Tom
console.log(s.age) // 25
原型/原型鏈繼承
- 使子類(lèi)的原型指向父類(lèi)的實(shí)例實(shí)現(xiàn)繼承
function Person () {
this.name = 'Tom'
this.age = 25
}
function Son () {}
Son.prototype = new Person() // Son的原型指向Person的實(shí)例
var m = new Son() // 實(shí)例賦值給m
console.log(m.name) // Tom
console.log(m.age) // 25
Object.create經(jīng)典繼承
var person = {
name: 'Tom',
age: 25
}
var son = Object.create(person)
console.log(son.name) // Tom
console.log(son.age) // 25
<!-- Object.create()是讓一個(gè)對(duì)象的原型繼承另外一個(gè)對(duì)象袖瞻;所以雖然a.name和a.age是可以訪問(wèn)成功的,但實(shí)際上a本身并沒(méi)有這些屬性孕似,而是a的原型上有這些屬性萄窜。 -->
call, apply實(shí)現(xiàn)繼承
- 構(gòu)造函數(shù)的名字.call( 當(dāng)前對(duì)象厂捞,屬性,屬性....) 解決了屬性繼承問(wèn)題,但是不能繼承父級(jí)的方法
function Person (name, age) {
this.name = name
this.age = age
}
function Student (name, age, score) {
// Person.apply(this, [name, age]) // apply實(shí)現(xiàn)繼承
Person.call(this, name, age) // call實(shí)現(xiàn)繼承
this.score = score
}
var a = new Student('李四', '25', '100');
console.log(a.name) // 李四
console.log(a.age) // 25
console.log(a.score) // 100
對(duì)象冒充繼承
- 讓父類(lèi)的構(gòu)造函數(shù)成為子類(lèi)的方法主卫,然后調(diào)用孩子類(lèi)的方法,并通過(guò)this給所有的屬性和方法賦值
function Person (name, age) { // Person函數(shù)被Son繼承
this.name = name
this.age = age
this.showAge=function() {
console.log(this.age)
}
}
function Son (name, age){ // 被用作構(gòu)造函數(shù)鹃愤,創(chuàng)建一個(gè)實(shí)例對(duì)象簇搅。
this.newMethod = Person // 將函數(shù)Person賦值給屬性newMethod。
this.newMethod(name, age) // 執(zhí)行函數(shù)newMethod软吐,對(duì)函數(shù)Person中的屬性賦值瘩将,完成繼承。
delete this.newMethod // 刪除屬性(可刪可不刪)
}
var obj = new Son("Tom", "25")
console.log(obj.showAge())// 25
console.log(obj.name) // Tom
相關(guān)文章: http://www.reibang.com/p/b163e72aa8ae