JS偽繼承prototype實現(xiàn)方法示例
本文實例講述了JS偽繼承prototype實現(xiàn)方法。分享給大家供大家參考,具體如下:
眾所周知JS中沒有類的概念,但是要想實現(xiàn)類的功能可以同過function模擬。如:
第一種繼承 (屬性繼承)
//該函數(shù)相當于是一個構造器,也是一個偽類
function Fn(){
this.a = 4;
this.b = 5;
this.log = function(){
console.log(this.a,this.b);
}
}
function Fn1(){
Fn.call(this);//調用父類的構造函數(shù)
}
Fn1.prototype = Fn.prototype;
var fn = new Fn();
var fn1 = new Fn1();
//由此可見Fn1 是fn1的子類。
fn1 instanceof Fn; // true
fn instanceof Fn1; // true
fn.a = 5;
//由此可見Fn1 繼承了 Fn得所有屬性和方法
//而是是復制了一份Fn的屬性和方法,并不是對象的引用。
console.log(fn.a); // 5
console.log(fn1.a); // 4
this.log(); // 4 5
總結: 這種繼承,是重新拷貝一份放入內存中,他們的值互相獨立,修改一個不會改變另一個。
第二種繼承 原型繼承(prototype)
function Fn(){}
Fn.prototype.data = {
name: 'zhangsan'
}
Fn.prototype.getName = function(){
return this.data.name;
}
function Fn1(){}
//原型鏈繼承
Fn1.prototype = Fn.prototype;
var fn = new Fn();
var fn1 = new Fn1();
//所用Fn1 繼承了 Fn
fn1 instanceof Fn;//true
console.log(fn1.getName()); // zhangsan
console.log(fn.getName()); // zhangsan
//修改了fn的name屬性值
fn.data.name = 'lisi';
// 由此我們可看出 原型鏈繼承 是 引用繼承
//不會重新拷貝一份變量。就像對象的引用一樣。
console.log(fn.getName()); // lisi
console.log(fn1.getName()); // lisi
兩種類的寫法造成示例的區(qū)別
//第一種
function Fn(){
this.a = 4;
this.b = 5;
this.log = function(){
console.log(this.a,this.b);
}
}
var fn1 = new Fn();
var fn2 = new Fn();
fn1.a = 1;
//由此可以看出兩個對象互不影響
//說明每個對象里都存在一份a和b
fn1.log(); // 1 5
fn2.log(); // 4 5
//第二種
function Fn(){}
fn.prototype.name = 'zhangsan';
fn.prototype.data = {
a: 4,
b: 5
}
fn.prototype.log = function(){
console.log(this.data.a,this.data.b);
}
var fn1 = new Fn();
var fn2 = new Fn();
fn1.a = 1;
//由此可見就算是不同的示例他們他們所指向的值是同一個。
fn1.log();//1 5
fn2.log();//1 5
fn2.name = 'lisi';
//這里fn1.name并沒有被修改
console.log(fn1.name); //zhangan
console.log(fn2.name); // lisi
總結
類中直接this. 出來的屬性和方法都會直接復制一份給子類或者實例對象。個子類或實例對象之間互不影響。
使用prototype增加的屬性和方法,對象類型的只有一份,值類型的這會被復制。
收獲
由于函數(shù)都是通用的,所以比較上面兩種方法,第二種明顯比第一種性能要好的多,因為避免了沒有必要的復制,肯定會比較節(jié)省內存。所以以后寫類的時候,盡量使用第二種方式。
更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數(shù)學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
- Javascript中 關于prototype屬性實現(xiàn)繼承的原理圖
- JavaScript類和繼承 prototype屬性
- js中繼承的幾種用法總結(apply,call,prototype)
- 深入了解javascript中的prototype與繼承
- javascript prototype的深度探索不是原型繼承那么簡單
- JavaScript面向對象之Prototypes和繼承
- Javascript 原型和繼承(Prototypes and Inheritance)
- JavaScript不使用prototype和new實現(xiàn)繼承機制
- JavaScript使用prototype原型實現(xiàn)的封裝繼承多態(tài)示例
- javascript基于prototype實現(xiàn)類似OOP繼承的方法
- Javascript中的prototype與繼承
- JavaScript使用prototype屬性實現(xiàn)繼承操作示例
相關文章
OkHttp踩坑隨筆為何 response.body().string() 只能調用一次
想必大家都用過或接觸過 OkHttp,我最近在使用 Okhttp 時,就踩到一個坑,在這兒分享出來,以后大家遇到類似問題時就可以繞過去2018-01-01
怎么選擇Javascript框架(Javascript Framework)
如果你正面臨這樣的問題,希望下面的幾個建議對你在選擇javascript框架上會有所幫助2013-11-11

