名称:    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. Allow Only Ajax Requests For An Action In ASP.NET Core

    ASP.NET Core offers attributes such as [HttpGet] and [HttpPost] that allow you to restrict the HTTP ...

  2. Nuget 多平台多目标快速自动打包

    构建现代的 .Net 应用离不开 Nuget 的支持,而快速打包 Nuget 成了提高生产率的有效方法. 1. 前置条件 为了实现 Nuget 的快速打包,我们需要先解决一些前置依赖,无论是 .Net ...

  3. vscode的插件收集

    转:https://zhuanlan.zhihu.com/p/27905838 转:https://segmentfault.com/a/1190000006697219

  4. WordPress安装官方文档教程

    01.可访问的网址 02.目录和软件 包括: 访问 web服务器 (通过 shell 或者 FTP)的权限 一个 文本编辑器 一个 FTP客户端 (如果你需要在一个远程服务器上安装WordPress) ...

  5. Mac OSX下安装dlib (Python)

    1.在安装Dlib库之前需要安装的库:opencv,numpy 2.安装Xquartz2.7.11 Xquartz是执行Unix程序的图形窗口环境,为了兼容Unix和Linux下移植过来的程序就需要安 ...

  6. openstack虚拟机内核崩溃问题解决

    openstack对接的kvm虚拟化环境,创建虚拟机后无法进如系统,一直卡在call Trace . 解决办法: 更改配置文件的cpu-model,libvirt_cpu_mode = custom ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 HRyuji doesn't want to study 树状数组

    题目链接:https://nanti.jisuanke.com/t/A2007 题目大意:有一个序列含有n个数a[1],a[2],a[3],……a[n],有两种操作: 第一种操作:k=1,l,r,询问 ...

  8. Spring Boot 集成 Spring Security 实现权限认证模块

    作者:王帅@CodeSheep   写在前面 关于 Spring Security Web系统的认证和权限模块也算是一个系统的基础设施了,几乎任何的互联网服务都会涉及到这方面的要求.在Java EE领 ...

  9. SQLServer安装步骤(2012版为例)

    提示:SQLServer安装较为耗时,请确保时间充足. 图文如果无法正常显示,请移步 SQLServer安装步骤 第一步:下载 下载地址:https://www.microsoft.com/zh-cn ...

  10. loj6074 子序列

    题目链接 思路 首先考虑暴力\(dp\) 用\(f[i][j]\)表示前\(i\)个字符,以\(j\)这个字符结尾的本质不同的字符串个数. 然后就有如下的转移 \(if(s_i==j)\) \[f_{ ...