222

92 阅读3分钟

mvvm框架

vue的数据驱动视图是通过mvvm这种框架来实现的.mvvm框架主要包含3个部分:

Model: 数据部分,对应到前端就是javascript对象;

View: 视图部分,对应前端就是dom;

ViewModel: 连接视图与数据的中间件;

数据和视图是不能直接通讯的,需要通过viewModel来实现双方的通讯;当数据变化的时候,viewModel能够监听到这种变化,并及时通知view做出修改;

同样,当页面有事件触发时,viewModel也能够监听到事件,并通知model进行响应.

viewMode相当于一个观察者,监控着双方的动作,并及时通知对方进行相应的操作.

  • 如何进行监控?

vue在实例化过程中,遍历传给实例化对象选项中的data,遍历其所有属性并使用object.defineProperty把这些属性全部转为getter,setter.

通俗的讲:

//在普通html模板中使用特殊的语法将dom绑定到底层数据,一旦创建绑定,dom将于数据保持同步,每当修改了数据,dom便相应的更新.
//这样我们应用中的逻辑就是直接修改数据了,不必与dom更新搅在一起,让代码更容易编写,理解与维护.

data中定义的数组,数组里面有对象,假如改变了这个this.数组.对象.属性=值,胡子语法中的值没有改变怎么办;

是因为Object.defineProperty()的来劫持各个属性的getter和setter,但是有一个局限性,监听不到数组的变化,诗词可以用this.$set

js

数据类型 检测方法 数组对象怎么检测
  • 检测数组类型的方法

    • instanceof操作符 (检测右边构造函数在不在左边对象的原型链中) 不太推荐

      let arr=[1,2,3]
      console.log(arr instanceof Array)
      
      • 存在问题 : propotype是可以改变的,所以为true并不一定是数组
      • 不能判断对象,因为数组,函数,对象的原型链中都有Object
    • Array.isArray()

      let a = [1,2,3]
      Array.isArray(a);//true
      
      • 有一个限制,是在es5还是6才提出,在此之前不支持此方法,so封装一下

        if (!Array.isArray) {
          Array.isArray = function(arg) {
            return Object.prototype.toString.call(arg) === '[object Array]';
          };
        }
        
    • Object.protype.toString.call()

      let a = [1,2,3]
      Object.prototype.toString.call(a) === '[object Array]';//true//检验是否是函数
      let a = function () {};
      Object.prototype.toString.call(a) === '[object Function]';//true
      //检验是否是数字
      let b = 1;
      Object.prototype.toString.call(a) === '[object Number]';//true
      
闭包
  • 什么是闭包?

    • 闭包是一个可以在函数外面访问函数内部变量的函数
  • 作用

    • 可以在函数外部访问函数内部的变量
  • 语法( 闭包语法不固定,可以大致分为三个流程 )

    • 在函数外部声明闭包函数
    • 在闭包函数中 : 返回你想要访问的局部变量
    • 返回这个闭包函数
  • 本质

    • 闭包是函数内部和外部沟通的一座桥梁
  • 弊端??

构造函数new关键字的作用

js中所有的对象都是由构造函数创建

构造函数(造对象) : 如果调用一个函数 使用了 new关键字,这个函数称为构造函数

1.创建空对象
2.this指向这个对象
3.执行构造函数代码(完成对象的赋值)
4.返回这个对象
原型
原型 : 每一个构造函数创建的时候,系统会自动创建一个与之对应的对象,称之为原型对象
原型对象 : 为了解决构造函数中的方法  内存资源浪费 和  全局变量污染
  • 只要是构造函数就有prototype属性指向自身对应的原型对象
  • 只要是实例对象就有 _ prpto_ 指向构造函数原型
  function Person(name,age){                    
            this.name = name;
            this.age = age;
       };
Person.prototype.sex="man";
var p1=new Person()
console.log(p1);
        
console.log(p1.__proto__ === Person.prototype);//true
        
console.log(p1.sex); // 底层 p1.__proto__.sex
        
console.log(p1.__proto__.sex);
innerHTML和innerTEXT的区别

innertext获取文字

innerhtml获取文字+标签

 <div class="box">
        哈哈哈
        <p>我是</p>
    </div>
    
  var some=document.getElementsByClassName('box')[0]
        console.log(some.innerText);
        console.log(some.innerHTML);