js语言精粹之继承+数组 ²

2018-07-31  本文已影响44人  zz77zz

2018年7月31日11:34:17

第一篇:js语言精粹之对象+函数

以下是便利贴
YDK JS
Vscode 快捷键
原型式的继承——MDN

继续看书继续骗自己能成为大牛 本想一篇写到尾,但知识点放一起太杂 解耦🤔🤔🤔 做成系列好些 方便查看

继承

当函数被创建时 Function构造器产生的函数对象会运行类似this code:

this.protype = {constructor:this}

每个函数都有prototype对象
当var a = new A()

创建一个新对象 继承自构造器函数的原型对象
var that = Object.create(this.prototype)
// 绑定this 到 新对象
var other = this.apply(that,arguments)
//如果返回值不是对象 就返回该新对象  
return (typeOf other === 'object' && other) || that

定义一个构造器

  var Animal = function(name){
      this.name = name
  }
  Animal.prototype.get_name = function(){
      return this.name
  }
  Animal.prototype.say_name = function(){
      return this.saying || ''
  }

构造一个伪类继承Animal 这是通过定义他的constructor函数
并替换它的prototype为一个Animal的实例来实现的:

  var Cat = function(name){
      this.name = name
      this.saying = 'asdf'
  } 

  Cat.prototype = new Animal()
  console.log(Cat.prototype);
  Cat.prototype.get_ = function(){
      return this.say_name()
  }

  var mycat = new Cat('aili')
  console.log(mycat.say_name())
  console.log(mycat.get_name())
  console.log(mycat.get_())

验证继承关系

var a = new A()
a instanceof A

继承方法:

function Student(props) {
    this.name = props.name || 'Unnamed';
}

Student.prototype.hello = function () {
    alert('Hello, ' + this.name + '!');
}

function PrimaryStudent(props) {
    Student.call(this, props);
    this.grade = props.grade || 1;
}

// 实现原型继承链:
inherits(PrimaryStudent, Student);

// 绑定其他方法到PrimaryStudent原型:
PrimaryStudent.prototype.getGrade = function () {
    return this.grade;
};

function inherits(Child, Parent) {
    var F = function () {};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
}

JavaScript的原型继承实现方式就是:

1.定义新的构造函数,并在内部用call()调用希望“继承”的构造函数,并绑定this;
2.借助中间函数F实现原型链继承,最好通过封装的inherits函数完成;


以上的这些方法代码量太大需要写大量代码
ES6就很爽啊~
直接上Class 先定义一个类
没有对比就没有伤害来让我们看一下代码

function Student(name) {
    this.name = name;
}

Student.prototype.hello = function () {
    alert('Hello, ' + this.name + '!');
}

代码可读性不止提高了一个档次
class Student {
    constructor(name) {
        this.name = name;
    }

    hello() {
        alert('Hello, ' + this.name + '!');
    }
}

这里有点像python实现继承的方式 很优雅

原型

差异化继承 : 指明它与所基于的基本的对象的区别

var Animal = {
    name:'Aili',
    get_name:function(){
        return this.name
    },
    says:function(){
        return this.saying||''
    }
}
var myCat = Object.create(Animal)
myCat.name = '王八'
myCat.saying = '你好'
myCat.get_ = function(){
    return this.says()+' '+ this.name
}

函数化

var Animal = function(spec){
    var that = {}
    that.get_name=function(){
        return spec.name
    },
    that.says=function(){
        return spec.saying||''
    }

    return that
}

var mycat = Animal({name:'aili'})

部件 函数最后两页我实在看不下去了 可能是中午没休息的缘故吧 没怎么理解 会用 但是看书就是为了理解啊~~~

数组

数组是一段线性分配的内存 通过整数计算偏移并访问其中的元素
js没有一个好的机制区别数组跟对象

var is_array = function(val){
    return val &&
    typeof val === 'object' &&
    val.constructor === Array
}
// 或者

var is_array = function(val){
    return Object.prototype.toString.apply(val) === '[object Array]'
}

P75 2018年7月31日18:11:03 今天就先看到这儿 没效率今天 不爽且躁 所以与其浪费时间去写不如去看看有意思的东西 然后就有了接下来的分享时间

Airbnb JavaScript Style Guide 用更合理的方式写 JavaScript 定义了一整套编码规范
ES6 - 这篇可以 有点像阮一峰大神的 PPT的形式看国外大神脑洞很大
前端学习之路 墙裂推荐 - 有一点点共鸣 但就是没人家吊
国外的前端面试题总结 挑战算法的同学 这本书《编程之法:面试和算法心得》会帮助你

还有很多 之前都在github里关注的但一直没时间去看的
去年一整年都在准备材料出国耽误了一整年 把所有精力全放在雅思跟准备材料上
最后因为一些特殊原因没有去成 技术就没有更新没有学习
所以最近难得有时间可以学习 很开心 所以抓住机会 多学一点然后 读研阶段就会轻松很多~~~ 加油加油


2018年8月1日09:55:29

2018年8月1日19:25:51 今天开始写新项目了 小程序在线教育 没时间写算法跟这个blog了 很揪心 打个卡~~~😑😑😑😑😑😑

2018年8月2日14:59:29

给数组的redu方法

Array.prototype.redu = function(f,val){
    var i;
    for (i = 0;  i< this.length; i++) {
        val = f(this[i],val)
    }
    return val
}

var add = function(a,b){
    return a+b
}

var mult = function(a,b){
    return a*b
}
var data = [1,2,3,4,5]
data.total = function(){
    return this.redu(add,0)
}
var aaa = data.redu(add,0)
console.log(aaa);
var bbb = data.redu(mult,0)
console.log(bbb);

2018年8月13日09:20:12

十天前看的今天又回来继续看书 还是的回归"书本" 继续上次的

指定初始值的数组

Array.dim = (dimession,initial)=>{
    var a = []
    for(var i=0;i<dimession;i++){
        a[i] = initial
    }
    return a
}

var arr = Array.dim(50,'aili')
console.log(arr)

多维数组

Array.matrix = (m,n,initial)=>{
    var i,j,a,mat = []
    for(i=0;i<m;i++){
        a=[]
        for(j=0;j<n;j++){
            a[j] = initial
        }
        mat[i] = a
    }
    return mat
}

var mt = Array.matrix(4,4,'aili')
console.log(mt)

["aili", "aili", "aili", "aili"]
["aili", "aili", "aili", "aili"]
["aili", "aili", "aili", "aili"]
["aili", "aili", "aili", "aili"]

正则表达式

这是我最最最最不想学以及最薄弱的一章 🙄🙄🙄🙄🙄 我选择先放一放

数组的方法

我想把MDN上使用率最高的几个方法的用法总结一下
其实用Vs Code的小伙伴们 直接按住Ctrl点击数组方法就会看到用法和参数 返回值

a.concat(b) a.join('') var c = a.pop() 原数组a被修改 c等于最后数组一项
var c = a.push([]) a是合并数组 c是a的长度 var c = a.slice(start,end) splice重点 var c = a.splice(start,deleitem,additem)
apply() call() bind()

pop()实现方式

Array.prototype.pop = function(){
    return this.splice(this.length-1,1)[0]
}

push()实现方式

Array.prototype.push = ()=>{
    this.splice.apply(this,
        [this.length,0].concat(Array.prototype.slice.apply(arguments))
    )
    return this.length
}

Splice的实现方式 高能预警 P96

代码风格

JavaScript包含大量脆弱的、问题缠身的特性,它们会妨碍我们写出优秀的程序
良好的代码风格可以被更好的阅读
使用对象更好的管理代码,使用闭包信息隐藏

毒瘤

全局变量 在小项目里全局变量可以被程序任意部分修改
作用域 js用了块语法但是没有提供块级作用域

检测是否为数组

if(Object.prototype.toString.apply(my_value) === '[Object Array]'){
    //my_value是个数组
}

最后还写了一个Json 解析器 这部分代码就不贴了 github 百度 一搜搜一堆解析代码

完结! 撒花~~~

接下来就是把代码过一遍 然后开始看JavaScript面向对象编程
之前看到轮子哥的一条回答

问题是这样的
自学编程的最大障碍就是要马上获得结果 其实放到看书学习也一样 太急功近利 过于想看到结果 往往学的都不踏实
接下来要看的书就是《js面向对象编程》,因为《js语言精粹》到今天我花了14天已经算很慢的因为周末玩儿 有时候公司项目急等等原因。等价换算的话,前者花费时间大概应该在一个月左右完成 也有可能会很快就完成 我可以下班地铁上厕所排队时间全用来看的话 估计就3-5天时间而已 我该这么热血的看完还是慢慢来呢?
取决于我的心情 哈哈哈
我会把看书过程中比较高能的地方 总结出来 写成blog

上一篇下一篇

猜你喜欢

热点阅读