名称:    prototype--原型对象    __proto__--属性

原型链与继承网上搜索定义,看起来挺绕的 。先说继承: 所有的对象实例都可以共享原型对象包含的属性和方法  例如一个实例A被XX所创建那么这个实例A就会继承XX.prototype 。继承到哪里了那?继承到A.__proto__  属性里面了 。

这是一个最简单的原型链继承。然后我想b为什么没有prototype.然后有***找了一番理解一番得出:

每个对象都有 __proto__属性(并且指向该对象的构造函数的prototype)prototype是一个对象所以所有的prototype都有__proto__属性, 对象才有prototype属性(但不是所有的对象都有prototype);每个函数对象都有prototype。

有够绕。。。 总结一下  prototype原型对象      这个属性只有函数对象才有,并且prototype原型对象是个对象,所以他有__proto__这个属性。然后是所有对象的__proto__的值都是 自己所继承的原型对象(就像上图 a继承了b的原型对象prototype)。

然而不可能无限这样继承下去 继承的顶端是Object.prototype  (这里面就包含了js自己封装的一些方法,其实挺常用的一些方法)比如数组 的排序,删除增加什么的。都是从顶端继承来的。(不然还是从石头缝里蹦出来的。。。)

以上是定义。然后b为什么没有prototype   是因为 b是 构造函数a 所创建出来的一个实例对象。不是函数对象。所以没有prototype;  (我试了 数组,字符串,时间等常用的都没有此属性)(所以现在不是很明白除了函数对象还有什么有prototype)。

然后就是原型链:a.__proto__=b.prototype=c.prototype=...=Object.prototype(原型链的终点)。

当我们取a中的一个属性或者方法的时候。JS会先在a自己的里面找找不到再去继承的b.prototype里面找,找不到再去c.prototype,然后直到找到为止,或者找到尽头没找到返回undefined;

所以原型链的优点我们项目开始的一些方法封装尽量都封装在原型对象里面.

以下是常用方法

例如 简单的 字符串中的替换 replace()方法只是匹配并替换匹配到的第一个,我们自定义一个replaceAll;

String.prototype.replaceAll= function(s1,s2){
  return this.replace(new RegExp(s1,"gm"),s2);
}

关于数组去重 :

对于比较简单的数组去重使用indexOf判断就很方便,但是对于对象数组根据某个Key去重就比较麻烦。所以综合就是

Array.prototype.unique = function(key) {
  var arr = this;
  var n = [arr[0]];
  for (var i = 1; i < arr.length; i++) {
    if (key === undefined) {
    if (n.indexOf(arr[i]) == -1) n.push(arr[i]);
} else {
inner: {
  var has = false;
  for (var j = 0; j < n.length; j++) {
    if (arr[i][key] == n[j][key]) {
        has = true;
        break inner;
      }
    }
  }
      if (!has) {
        n.push(arr[i]);
      }
    }
  }
  return n;
}

这个去重只针对普通的及去重对象的KEY是当前的对象的第一级的key。

调用方法: [{a:1,b:2},{a:3,b:2},{a:1,b:2},{a:1,b:2}].unique();

时间:js Date()方法所得到的结果是ue May 08 2018 16:12:58 GMT+0800 (中国标准时间)     而不是我们日常见到的 20187/5/8等 。

Date.prototype.Format = function(formatStr)
{
var str = formatStr;
var Week = ['日','一','二','三','四','五','六'];
var month=this.getMonth()+1;
str=str.replace(/yyyy|YYYY/,this.getFullYear());
str=str.replace(/yy|YY/,(this.getYear() % 100)>9?(this.getYear() % 100).toString():'0' + (this.getYear() % 100));
str=str.replace(/MM/,month>9?month.toString():'0' + month);
str=str.replace(/M/g,month);
str=str.replace(/w|W/g,Week[this.getDay()]);
str=str.replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0' + this.getDate());
str=str.replace(/d|D/g,this.getDate());
str=str.replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0' + this.getHours());
str=str.replace(/h|H/g,this.getHours());
str=str.replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0' + this.getMinutes());
str=str.replace(/m/g,this.getMinutes());
str=str.replace(/ss|SS/,this.getSeconds()>9?this.getSeconds().toString():'0' + this.getSeconds());
str=str.replace(/s|S/g,this.getSeconds());
return str;
}
可以根据自己的需求改 replace 所对应的字符串
调用方法   new Date().Format('yyyy-MM-dd')

new Date().Format('YYYY/MM/dd')
怎样拼接都是自己定义的。
 
JS计算精度问题(这个问题涉及的是很基础的繁杂的知识。搜索学习吧。比较多 ,抽时间会做一个整理)
 
 相信大家在前端做计算的时候都会遇到浮点数字计算不准确。一开始我也是吐槽js然后搜索后才发现是自己的无知。
首先追溯到大学学的知识。计算机都是二进制运算的。所有的程序 在计算机最终执行都是二进制。  
有些浮点数转换二进制是无限小数的。这样超出的超出被截断了。最后计算机把二进制
计算的结果转换成十进制或者几进制的时候肯定会有误差。所以这个现象应该是只要不是二进制计算。其他的计算都会有这种结果。不分语言。
 所以我们的加减乘除在实际运用中对于浮点的不友好只能手动解决了(把浮点部分单拿出来做计算)。
 
加法
Number.prototype.add =function(arg1, arg2) {

var r1, r2, m, c;
try {
r1 = arg1.toString().split(".")[1].length;
}
catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
}
catch (e) {
r2 = 0;
}
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2));
if (c > 0) {
var cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", "")) * cm;
} else {
arg1 = Number(arg1.toString().replace(".", "")) * cm;
arg2 = Number(arg2.toString().replace(".", ""));
}
} else {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", ""));
}
return (arg1 + arg2) / m;
}

 减法
Number.prototype.sub=function(arg1, arg2) {

var r1, r2, m, n;
try {
r1 = arg1.toString().split(".")[1].length;
}
catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
}
catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

乘法

Number.prototype.mul=

function accMul(arg1, arg2) {

var m = 0, s1 = arg1.toString(), s2 = arg2.toString();

try {

m += s1.split(".")[1].length;

}

catch (e) {

}

try {

m += s2.split(".")[1].length;

}

catch (e) {

}

return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);

}

除法

Number.prototype.division=function(arg1, arg2) {

var t1 = 0, t2 = 0, r1, r2;

try {

t1 = arg1.toString().split(".")[1].length;

}

catch (e) {

}

try {

t2 = arg2.toString().split(".")[1].length;

}

catch (e) {

}

with (Math) {

r1 = Number(arg1.toString().replace(".", ""));

r2 = Number(arg2.toString().replace(".", ""));

return (r1 / r2) * pow(10, t2 - t1);

}

}

js原型链+继承 浅析的更多相关文章

  1. js 原型,原型链,原型链继承浅析

    对于网上的关于原型,原型链和原型链继承的晦涩语言说明就不累赘了,复制粘贴过来再解释一遍怕自己也整蒙了,本人最怕空气突然安静,四目对视,大眼对小眼,一脸懵逼. 我们先看下面

  2. js原型链继承的傻瓜式详解

    本文争取用最简单的语言来讲解原型链继承的OOP原理 0.如果对原型继承还没有大致了解,完全一头雾水,请先阅读 <JavaScript高级程序设计>第六章最后部分的寄生组合式继承 或者_廖雪 ...

  3. [js]js原型链继承小结

    这是之前总结的, 发现有很多的毛病,就是重点不突出,重新翻看的时候还是得耗费很长时间去理解这玩意. js中的继承 js中什么是类 1,类是函数数据类型 2.每个类有一个自带prototype属性 pr ...

  4. JS原型链继承

    继承普通版 继承逻辑上都差不多,普通版调用方式比较繁琐,不利于反复大量的使用: (function (){ //创建一个人员类 function Person(name){ this.name = n ...

  5. js原型链继承及调用父类方法

    方法1: var Parent= function () { }; Parent.prototype.process = function(){ alert('parent method'); }; ...

  6. js原型链与继承(初体验)

    js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...

  7. 深入理解JS原型链与继承

    我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...

  8. js继承之组合继承(结合原型链继承 和 借用构造函数继承)

    在我的前两篇文章中,我们已经介绍了 js 中实现继承的两种模式:原型链继承和借用构造函数继承.这两种模式都存在各自的缺点,所以,我们考虑是否能将这二者结合到一起,从而发挥二者之长.即在继承过程中,既可 ...

  9. js 原型链和继承(转)

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...

随机推荐

  1. MonkeyRunner 综合实践

    综合实践 测试场景 连接设备,自动安装并启动考研帮app 启动后登录账号(账号zxw1234 密码:zxw123456),然后截图并保存到指定文件位置. 思路分析 连接设备 安装app 启动app 输 ...

  2. 【python 字符串】 字符串的相关方法(二)

    查找元素所在的第一个的索引位置    text.find() 可有开始和结束位置查找  find('ex',3,6) # 查找元素的索引位置 text = 'alexalex' ret = text. ...

  3. codevs 2370 小机房的树(LCA)

    过了这么长的时间终于开始看LCA了... 有一次训练题卡在LCA当时不会...拖了好久好久...其实现在还是不会... 只会tarjan... 传送门 板子题咯 tarjan的算法就是基于先序遍历的顺 ...

  4. Go语言中的闭包

    一.函数的变量作用域和可见性 1.全局变量在main函数执行之前初始化,全局可见 2.局部变量在函数内部或者if.for等语句块有效,使用之后外部不可见 3.全局变量和局部变量同名的情况下,局部变量生 ...

  5. 浏览器开发者工具console

    浏览器开发者工具基本使用教程 谷歌Chrome浏览器开发者工具教程-基础功能篇 - 算命de博客 - CSDN博客 JavaScript Console 对象 | 菜鸟教程

  6. 上板子在线抓波发现app_rdy一直为低

    现象 使用Xilinx的MIG IP测试外挂DDR3的读写发现一段很短的时间后app_rdy恒为低,并且最后一个读出的数据全是F. (1)不读写数据,app_rdy正常为高,MIG IP初始化信号为高 ...

  7. Redis的两种持久化方式详细介绍

    一,Redis是一款基于内存的数据库,可以持久化,在企业中常用于缓存,相信大家都比较熟悉Redis了,下面主要分享下关于Redis持久化的两种模式 1.半持久化模式(RDB,filesnapshott ...

  8. Floyed-Warshall【弗洛伊德算法】

    首先介绍一下有关最短路径的知识 从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径.解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算 ...

  9. JDK环境部署

    JDK环境部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 说起JDK想必大家并不陌生,作为运维的小伙伴,谁不层接触过Java程序员呢?而且在搭建服务上时也必须得接触他,比如to ...

  10. MySQL 死锁场景

    SESSION 1 SESSION 2 SESSION 3 START TRANSACTION START TRANSACTION START TRANSACTION INSERT       INS ...