国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript prototype對象的屬性說明

2019-11-21 00:40:54
字體:
來源:轉載
供稿:網友

一、什么是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()

主站蜘蛛池模板: 龙门县| 阳谷县| 阳城县| 镇雄县| 九寨沟县| 越西县| 博客| 姚安县| 阜阳市| 青州市| 鹿泉市| 孟连| 云南省| 石阡县| 广德县| 庆城县| 宜川县| 当阳市| 岢岚县| 三亚市| 临城县| 抚松县| 常山县| 莱阳市| 孝昌县| 平江县| 镇江市| 武邑县| 尉犁县| 芒康县| 寿宁县| 武山县| 织金县| 徐水县| 建昌县| 南华县| 密云县| 普兰店市| 扬中市| 汤原县| 开封县|