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属性让我们能在对象上自己定义方法和属性。


  • 相关阅读:
    BadUSB 利用
    java 将函数作为参数传递
    odoo12 修行提升篇之 常用的高阶函数 (二)
    odoo12 修行提升篇之 异步定时任务 (一)
    odoo12 修行基础篇之 利用kanban做分析 点击跳转分析模型列表 (九)
    odoo12 修行基础篇之 kanban (八)
    odoo12 修行基础篇之 记录批处理 (七)
    odoo12 修行基础篇之 列表的筛选和分组 (六)
    odoo12 修行基础篇之 添加记录编码 (五)
    odoo12 修行基础篇之 添加工作流和操作记录 (四)
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6962101.html
Copyright © 2011-2022 走看看