一、什么是JavaScript中對象的prototype屬性
JavaScript中對象的prototype屬性,是用來返回對象類型原型的引用的。我們使用prototype屬性提供對象的類的一組基本功能。并且對象的新實例會”繼承”賦予該對象原型的操作。但是這個prototype到底是怎么實現和被管理的呢?
對于對象的prototype屬性的說明,JavaScript手冊上如是說:所有 JavaScript內部對象都有只讀的 prototype 屬性。可以向其原型中動態添加功能(屬性和方法),但該對象不能被賦予不同的原型。然而,用戶定義的對象可以被賦給新的原型。
在JavaScript中,prototype對象是實現面向對象的一個重要機制。每個函數就是一個對象(Function),函數對象都有一個子對象prototype對象,類是以函數的形式來定義的。prototype表示該函數的原型,也表示一個類的成員的集合。在通過new創建一個類的實例對象的時候,prototype對象的成員都成為實例化對象的成員。
1、該對象被類所引用,只有函數對象才可引用;
2、在new實例化后,其成員被實例化,實例對象方可調用。
同時,函數是一個對象,函數對象若直接聲明成員,不用被實例化即可調用。
JavaScript通過一種鏈接機制來支持繼承,而不是通過完全面向對象語言(如Java)所支持的基于類的繼承模型。每個JavaScript對象都有一個內置的屬性,名為prototype。prototype屬性保存著對另一個JavaScript對象的引用,這個對象作為當前對象的父對象。
當通過點記法引用對象的一個函數或屬性時,倘若對象上沒有這個函數或屬性,此時就會使用對象的prototype屬性。當出現這種情況時,將檢查對象prototype屬性所引用的對象,查看是否有所請求的屬性或函數。如果prototype屬性引用的對象也沒有所需的函數或屬性,則會進一步檢查這個對象(prototype屬性引用的對象)的prototype屬性,依次沿著鏈向上查找,直到找到所請求的函數或屬性,或者到達鏈尾,如果已經到達鏈尾還沒有找到,則返回undefined。從這個意義上講,這種繼承結構更應是一種“has a”關系,而不是“is a”關系
神啊,我什么也看懂,怎么辦?看似搞得我很牛,說實話我也看不懂!^_^ ^_^ ^_^
二、prototype屬性應用實例
我們所常見的類包括:數組變量(Array)、邏輯變量(Boolean)、日期變量(Date)、結構變量(Function)、數值變量(Number)、對象變量(Object)、字符串變量(String) 等,而相關的類的方法,也是程序員經常用到的(在這里要區分一下類的注意和屬性發方法),例如數組的push方法、日期的get系列方法、字符串的split方法等等,
但是在實際的編程過程中不知道有沒有感覺到現有方法的不足?prototype 方法應運而生!下面,將通過實例由淺入深講解 prototype 的具體使用方法:
先看一個很傻的例子:
JavaScript代碼
function func(){
func.prototype.name = “prototype of func”;
}
var f = new func();
alert(f.name); //prototype of func
先創建一個func對象,設置func對象的name屬性,實例化f;
1.幾個簡單的例子:
(1)數字相加:
JavaScript代碼
Number.prototype.add=function(num){
return (this+num);//這里的this指向Number
};
alert((3).add(15));//18
(2) Boolean.rev(): 作用,布爾變量取反
實現方法:Boolean.prototype.rev = function(){return(!this);}
試驗:alert((true).rev()) -> 顯示 false
2、已有方法的實現和增強,初識 prototype:
(1) Array.push(new_element)
作用:在數組末尾加入一個新的元素
實現方法:
Array.prototype.push = function(new_element){
this[this.length]=new_element;
return this.length;
}
讓我們進一步來增強他,讓他可以一次增加多個元素!
實現方法:
Array.prototype.pushPro = function() {
var currentLength = this.length;
for (var i = 0; i < arguments.length; i++) {
this[currentLength + i] = arguments[i];
}
return this.length;
}
應該不難看懂吧?以此類推,你可以考慮一下如何通過增強 Array.pop 來實現刪除任意位置,任意多個元素(具體代碼就不再細說了)
3、新功能的實現,深入 prototype:在實際編程中所用到的肯定不只是已有方法的增強,更多的實行的功能的要求,下面我就舉兩個用 prototype 解決實際問題的例子:
(1) String.left()
問題:用過 vb 的應該都知道left函數,從字符串左邊取 n 個字符,但是不足是將全角、半角均視為是一個字符,造成在中英文混排的版面中不能截取等長的字符串
作用:從字符串左邊截取 n 個字符,并支持全角半角字符的區分
實現方法:
String.prototype.left = function(num,mode){
if(!//d+/.test(num))return(this);
var str = this.substr(0,num);
if(!mode) return str;
var n = str.Tlength()
主站蜘蛛池模板:
龙门县|
阳谷县|
阳城县|
镇雄县|
九寨沟县|
越西县|
博客|
姚安县|
阜阳市|
青州市|
鹿泉市|
孟连|
云南省|
石阡县|
广德县|
庆城县|
宜川县|
当阳市|
岢岚县|
三亚市|
临城县|
抚松县|
常山县|
莱阳市|
孝昌县|
平江县|
镇江市|
武邑县|
尉犁县|
芒康县|
寿宁县|
武山县|
织金县|
徐水县|
建昌县|
南华县|
密云县|
普兰店市|
扬中市|
汤原县|
开封县|