zoukankan      html  css  js  c++  java
  • JavaSript之prototype属性

    近期在JavaSript进行Array操作的时候发现没有删除节点的方法。而我要实现的效果须要不断调用删除节点的方法。查找了相关资料发现能够利用prototype属性给Array添加删除节点的方法。而且该方法同Array自身拥有的push()、pop()、reverse()、slice()、sort()、join()等方法一样使用。

    代码1

    Array.prototype.remove = function (dx) {
            if (isNaN(dx) || dx > this.length) { return false; }
            for (var i = 0, n = 0; i < this.length; i++) {
                if (this[i] != this[dx]) {
                    this[n++] = this[i]
                }
            }
            this.length -= 1
        }

    測试该方法

    代码2

     $(function () { var arr = [1, 2, 3];
            arr.remove(1);
            var s='';
            for(var i=0;i<arr.length;i++){
                s = s + arr[i]+',';
            }
            alert(s.substring(0,s.length-1));
        });

    数组是从0開始编号,因此删除的元素是“2”,输出的结果为“1,3”,正确。

    w3school给的解释是:prototype使您有能力给对象加入属性和方法。

    因为JavaSript没有类的概念,因此也无法向面向对象语言一样有继承。prototype正是为了解决此问题,为开发人员打开了一扇门。通过这扇门,开发人员能够在对象上定义属性和方法,然后在初始化一个变量。比如数组,那么该数组就具有了对新定义的属性和方法的一个引用(能够将其理解为是对Array对象新定义属性和方法的“继承”)。有的人会将“代码1”中的代码理解为是赋值,这是极其不准确的。假设是赋值。那么将会指向内存中同一块区域,当时当我们假设在“代码2”中再初始化一个数组的话,数组1和数组2分别调用remove()方法。将不会受到影响。

    以下在Date对象实现了Format()方法。这个平时也用得比較多。

        // Date对象上实现Format方法,将 Date 转化为指定格式的String
        // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 能够用 1-2 个占位符。 
        // 年(y)能够用 1-4 个占位符。毫秒(S)仅仅能用 1 个占位符(是 1-3 位的数字) 
        // 用法: 
        // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") -> 2014-04-16 10:12:30.526
        // (new Date()).Format("yyyy-M-d h:m:s.S")      -> 2014-4-16 7:6:9.25
     Date.prototype.Format = function (fmt) {
            var o = {
                "M+": this.getMonth() + 1, //月份 
                "d+": this.getDate(), //日 
                "h+": this.getHours(), //小时 
                "m+": this.getMinutes(), //分 
                "s+": this.getSeconds(), //秒 
                "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
                "S": this.getMilliseconds() //毫秒 
            };
            // RegExp.$1 返回匹配的第一个字符串(以括号为标识)
            if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
            for (var k in o) {
                if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ?

    (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); } return fmt; }


    在这个样例中有一个正則表達式的应用,RegExp.$1能够返回第一个匹配的字符串,以下用一个样例来说明问题。

    $(function () {
           var r = /^(d{4})-(d{1,2})-(d{1,2})$/;
            r.exec('1988-01-10');
            s1 = RegExp.$1;
            s2 = RegExp.$2;
            s3 = RegExp.$3;
            alert(s1 + "," + s2 + "," + s3) 
    });

    返回的结果:1988,01,10

    本文主要是对JavaSript的prototype属性使用心得进行总结。程序开发中太多时候我们习惯了“.”这个操作符,通过该操作符来引出对象内置的属性和方法,然而有的时候并不是如我们期望的那样别人啥事都为我们准备好了。prototype属性让我们能在对象上自己定义方法和属性。


  • 相关阅读:
    ACM_“IP地址”普及(进制转换)
    goj 堆箱子咯(栈)
    ACM_夏天到了,又到了出游的季节
    ACM_迟到的祝福(四)
    ACM_梦中的函数
    ACM_ZHANGZHANG喜欢手表
    ACM_出题人这样不好吧
    ACM_Mystery
    ACM_Repeating Characters
    P1160 队列安排 luogu洛谷
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6962101.html
Copyright © 2011-2022 走看看