您好,登錄后才能下訂單哦!
javascript的對(duì)象繼承有幾種方法?相信很多人對(duì)javascript的對(duì)象繼承方法的了解處于一知半解狀態(tài),小編給大家總結(jié)了以下內(nèi)容。如下資料是關(guān)于javascript的對(duì)象繼承方法的內(nèi)容。
1原型鏈繼承
所有的javascript 都會(huì)繼承一個(gè)prototype原型對(duì)象 繼承原型對(duì)象上的屬性和方法。
例如:
date 對(duì)象 從Date.prototype 原型對(duì)象上繼承屬性和方法
array 對(duì)象 從Array.prototype 原型對(duì)象上繼承屬性和方法
要繼承 必須有父類 ----子類繼承父類 繼承父類的屬性和方法
特點(diǎn):實(shí)例可以繼承自身實(shí)例的屬性 父類里面的構(gòu)造函數(shù)屬性 父類的原型屬性
缺點(diǎn):不能繼承子類的原型屬性和方法
太單一 只能單繼承 不能進(jìn)行多繼承
繼承之后原型對(duì)象上的屬性全部是共享的
子類不能直接向父類傳遞參數(shù)
function Person() {
this.name;
this.sex;
this.sleep = function () {
return "睡覺(jué)";
};
this.eat = function () {
return "吃飯"
}
}
//給父類添加原型屬性和方法
Person.prototype.job = function () {
return "工作";
};
Person.prototype.color = "黃";
function Child() {
this.age = 20;
}
Child.prototype = new Person(); //核心 讓子類的原型 等于 父類的實(shí)例對(duì)象
var child = new Child();
console.log(Child.prototype);//繼承之后指向Person 對(duì)象
console.log(child instanceof Child); ///true
console.log(child instanceof Person); //true
2構(gòu)造函數(shù)
直接使用call apply 繼承
構(gòu)造繼承直接在子類的內(nèi)部去寫(xiě)
優(yōu)點(diǎn): 可以實(shí)現(xiàn)多繼承;可以向父類傳遞參數(shù)
缺點(diǎn): 子類的實(shí)例是本身 不是父類;構(gòu)造繼承只能call apply 父類對(duì)象的構(gòu)造屬性和方法 不能復(fù)制原型屬性和方法
//父類
function Animail(s, a) {
this.sex = s;
this.age = a;
this.sleep = function () {
return "睡覺(jué)";
}
}
//Animal 添加原型屬性
Animail.prototype.color = "花色";
//動(dòng)物類別類
function Type(t) {
this.type = t;
}
//子類
function Cat(n, s, a, t) {
this.name = n;
this.eat = function () {
return "吃東西"
}
Animail.call(this, s, a);
Type.apply(this, [t]);
}
//實(shí)例化子類對(duì)象
var cat = new Cat("小貓", "公", 2, "貓科"); //類對(duì)象在實(shí)例化的時(shí)候會(huì)直接執(zhí)行自身的構(gòu)造函數(shù)
console.log(cat);
/檢測(cè)構(gòu)造繼承里面的類別問(wèn)題
console.log(cat instanceof Cat);//true
console.log(cat instanceof Animail);//false
console.log(cat instanceof Type);//false
3實(shí)例繼承
原理是在子類里面直接構(gòu)造父類的實(shí)例
優(yōu)點(diǎn):可以傳遞給父類參數(shù) 不限制調(diào)用的方式
缺點(diǎn):不能多繼承;不能拿到子類的構(gòu)造屬性和方法
實(shí)例繼承 子類的實(shí)例不是本身而是父類
//父類
function Person(n, s) {
this.name = n;
this.sex = s;
this.sleep = function () {
console.log(this.name + "睡覺(jué)");
}
}
//子類
function Child(n, s) {
var per = new Person(n, s);
return per;
}
//實(shí)例化子類對(duì)象
var child = new Child("張三", "女");
console.log(child instanceof Child);//false
console.log(child instanceof Person);//true
4拷貝繼承
原理是 將父類里面的屬性方法拷貝給子類
子類的實(shí)例是本身 不是父類
子類向父類傳遞參數(shù)
可以支持多繼承
function Animal(n) {
this.name = n;
this.sleep = function () {
return this.name + "睡覺(jué)"
}
}
function Cat(n, a) {
this.age = a;
//拷貝
var animal = new Animal(n);
for (var p in animal) {
Cat.prototype[p] = animal[p];
}
//繼續(xù)new 別的對(duì)象 進(jìn)行拷貝
}
/* Cat.prototype.name="";
Cat.prototype.sleep=function (){
};*/
//實(shí)例化子類
var cat = new Cat("小花", 3);
console.log(cat);
console.log(cat instanceof Cat);//true
console.log(cat instanceof Animal);//false
5組合繼承
構(gòu)造繼承+原型鏈繼承
子類的實(shí)例即是本身也是父類
沒(méi)有原型對(duì)象屬性的共享
實(shí)現(xiàn)多繼承
調(diào)用了兩次父類的構(gòu)造函數(shù)
function Person(n) {
this.name = n;
this.sleep = function () {
return this.name + "睡覺(jué)";
}
}
Person.prototype = {
job: function () {
return this.name + "job";
}
}
function Child(n, a, s) {
this.age = a;
this.sex = s;
//構(gòu)造繼承
Person.call(this, n);
}
//原型鏈繼承
Child.prototype = new Person();
var child = new Child("張三", 18, "男");
console.log(child);
console.log(child instanceof Child); //true
console.log(child instanceof Person);//true
6寄生組合繼承
是處理組合繼承的缺點(diǎn) 避免兩次調(diào)用父類的構(gòu)造函數(shù)
原理是把父類的原型給予一個(gè)空對(duì)象的原型
子類對(duì)象的實(shí)例即是本身也是父類
function Person(n) {
this.name = n;
this.sleep = function () {
return this.name + "睡覺(jué)";
}
}
console.log(Person.prototype);
function Child(n, a) {
this.age = a;
this.eat = function () {
return this.name + "吃飯"
}
Person.call(this, n);
}
//寄生
(function () {
var fn = function () {
};
//將父類的原型對(duì)象給予空對(duì)象
fn.prototype = Person.prototype;
Child.prototype = new fn();
})();
var child = new Child("李四", 20);
console.log(child);
console.log(child instanceof Child); //true
console.log(child instanceof Person); //true
關(guān)于javascript的對(duì)象繼承的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。