Vue不兼容IE8原因以及Object.defineProperty详解

原因概述:

  • Vue.js使用了IE8不能模拟的ECMAScript5特性. Vue.js支持所有兼容ES5的浏览器.
  • Vue将遍历此对象所有的属性, 并使用Object.defineProperty把这些属性全部转为getter/setter.
  • Object.defindProperty是仅ES5支持, 且无法shim的特性.

接下来逐步介绍概念.

shim特性

指把一个库引入一个旧的浏览器, 然后用旧的API, 实现一些新的API的功能.

Object.definePropety()

  • 语法: Object.definePropety(obj, prop, descriptor)
  • 参数:
    • obj: 操作对象
    • prop: 需要操作的属性名称
    • descriptor: 属性具有的特性
  • 返回值: 传入的对象, 即第一个参数obj
  • 针对特性描述存在两种形式: 数据描述和存取器描述

数据描述

当修改或定义对象的时候, 给属性添加一些特性

var obj = {
test: 'hello'
} // 对象已有的属相添加特性描述
Object.defineProperty(obj, 'test', {
configurable: true | false,
enumerable: true | false,
value: `任意类型的值`,
writable: true | false
}) // 对象新添加的属性描述
Object.defineProperty(obj, 'newKey', {
configurable: true | false,
enumerable: true | false,
value: `任意类型的值`,
writable: true | false
})

value

  • 属性对应的值, 可以为任意类型的值.
  • 默认: undefined
// 不设置value的值
Object.defineProperty(obj, 'newKey', { })
console.log(obj.newKey) // undefined /*
注: 两段代码不能同时出现 ;
报错: Cannot redefine property: newKey
原因: configurable属性默认为false, 不能修改; writable默认fasle, 不能被重写
*/
// 设置value值
Object.defineProperty(obj, 'newKey', {
value: 'this is test'
})
console.log(obj.newKey) // undefined

writable

  • 属性的是否可以被重写.
  • 默认false, 不能被重写.
// writable为false, 不可被重写
Object.defineProperty(obj, 'newKey', {
value: 'hello',
writable: false
}) Object.defineProperty(obj, 'newKey', {
value: 'change'
})
// 这种情况下会报错: Cannot redefine property: newKey
console.log(obj.newKey)
// 可以被重写
Object.defineProperty(obj, 'newKey', {
value: 'hello',
writable: false
}) obj.newKey = 'change' console.log(obj.newKey) // hello

enumerable

  • 此属性是否可以枚举(使用for...in或者Object.keys)
  • 默认为false: 不可枚举
// 不可枚举
var obj = {} Object.defineProperty(obj, 'newKey', {
value: 'hello'
}) console.dir(obj) // {}
// 可以枚举
var obj = {} Object.defineProperty(obj, 'newKey', {
value: 'hello',
enumerable: true
}) console.dir(obj) // { newKey: 'hello' }

configurable

  • 目标属性是否可以被删除
  • 目标属性的特性是否可以被再次修改
  • 默认false, 不可删除与修改
// 属性不可被删除
var obj = {}
Object.defineProperty(obj, 'newKey', {
value: 'hello',
configurable: false
})
delete obj.newKey
console.log(obj.newKey) // hello
// 属性可以被删除
var obj = {}
Object.defineProperty(obj, 'newKey', {
value: 'hello',
configurable: true
})
delete obj.newKey
console.log(obj.newKey) // undefined
// 不能修改特性
var obj = {}
Object.defineProperty(obj, 'newKey', {
value: 'hello',
writable: false,
configurable: false
}) Object.defineProperty(obj, 'newKey', {
writable: true,
})
// 报错: Cannot redefine property: newKey
// 再次修改特性
var obj = {}
Object.defineProperty(obj, 'newKey', {
value: 'hello',
writable: false,
configurable: true
}) Object.defineProperty(obj, 'newKey', {
writable: true,
})
obj.newKey = 'change'
console.log(obj.newKey) // change

注意

  • 一旦使用Objec.defineProperty给对象添加属性, 如果不设置属性的话, 那么configuable, enumerable, writable这些都是默认的false
  • 不能被枚举, 不能被重写, 不能被再次更改属性

存取器描述

当使用存取器描述特性的时候, 允许使用以下特性属性:

var obj = {}

Object.defineProperty(obj, 'newKey', {
get: function() {} | undefined,
set: function() {} | undefined,
configurable: true | false,
enumerable: true | false
})
  • 当使用了getter或者setter方法, 不允许使用writablevalue这两个属性

getter/setter

  • 当设置或获取某个对象的属性值的时候, 可以提供getter/setter方法

    • getter: 是一种获取值的方法
    • setter: 是一种设置值的方法
// 在特性中使用get/set属性来定义对应的方法
var obj = {}
var initVlue = 'hello'
Object.defineProperty(obj, 'newKey', {
get: function () {
// 当获取值的时候, 触发这个函数
return initVlue
},
set: function (value) {
// 设置值的时候, 触发这个函数
initVlue = value
}
})
// 获取值
console.log(obj.newKey) // hello obj.newKey = 'change' console.log(initVlue)// change
  • get/set不必成对出现, 任写其一就可以. 如果设置不方便, 则get和set的默认值为undeifend

兼容性

在IE8下只能对DOM对象使用, 如果对原生对象使用Object.defineProtry()会报错


参考: https://segmentfault.com/a/1190000007434923

Vue不兼容IE8原因以及Object.defineProperty详解的更多相关文章

  1. IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/04/03/kaifarenyuangongju2.html 在上一篇文章IE8“开发人员工具” ...

  2. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  3. vue.js循环for(列表渲染)详解

    vue.js循环for(列表渲染)详解 一.总结 一句话总结: v-for <ul id="example-1"> <li v-for="item in ...

  4. Vue通信、传值的多种方式,详解

    Vue通信.传值的多种方式,详解 转自:https://blog.csdn.net/qq_35430000/article/details/79291287 一.通过路由带参数进行传值 ①两个组件 A ...

  5. vue.js选择if(条件渲染)详解

    vue.js选择if(条件渲染)详解 一.总结 一句话总结: v-if <!DOCTYPE html> <html lang="en"> <head& ...

  6. 【转载】html中object标签详解

    [转载自http://blog.csdn.net/soliy/archive/2010/03/22/5404183.aspx] html标签之Object标签详解 作者:网络    出处:网络     ...

  7. Vue通信、传值的多种方式,详解(都是干货)

    Vue通信.传值的多种方式,详解(都是干货) 可参考博客: https://blog.csdn.net/qq_35430000/article/details/79291287

  8. JAVA中Object类方法详解

    一.引言 Object是java所有类的基类,是整个类继承结构的顶端,也是最抽象的一个类.大家天天都在使用toString().equals().hashCode().waite().notify() ...

  9. Vue双向绑定的关键:Object.defineProperty()

    这个方法了不起啊.vue.js和avalon.js 都是通过它实现双向绑定的.而且Object.observe也被草案发起人撤回了.所以defineProperty更有必要了解一下了. 先上几行代码看 ...

随机推荐

  1. excel 创建数据有效性及背景颜色

    需求:用excel做数据或者表格时经常需要在一列中给出固定的几个进行悬着,这是如果每次键盘输入降低工作效率.如果做成鼠标双击进行选择,则提高很多效率,比如需要给一列填写Pass或Failure时,具体 ...

  2. Monkey测试的参数

    一.Monkey测试简介 Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动Trackball.按键等操作来对设备上的程序进行压 力测试,检测程序多久 ...

  3. aop中获取方法的注解

    @Around(value="@annotation(apiLog)") public Object around(ProceedingJoinPoint pjp, ApiLog ...

  4. java输入输出流实例代码

    1.编写一个程序,读取源代码文件的内容并在控制台输出.如果源文件不存在,则显示相应的错误信息. package src; import java.io.File; import java.io.Fil ...

  5. DOM操作三

    1.以一个对象的x和y属性的方式返回滚动条的偏移量 function getScrollOffsets(w){ //使用指定的窗口,如果不带参数则使用当前窗口 w= w || window; //除了 ...

  6. C# delegate Action<T> lambda表达式

    转载以记录:http://blog.csdn.net/educast/article/details/7219854 在使用 Action<T> 委托时,不必显式定义一个封装只有一个参数的 ...

  7. Educational Codeforces Round 10 D. Nested Segments

    D. Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. js实现域名判断后跳转到指定网址

    js实现域名判断后跳转到指定网址,也适用于同一虚拟空间放多个网站: <script>       try           {               if(self.locatio ...

  9. SKU多维属性状态判断算法

    作者:周琪力,前端工程师,网络常用昵称「keelii」.在过去的4年里主要负责京东网站商品详情页的前端系统架构和开发,平时主要写 JavaScript 偶尔写点NodeJS,Python.琪力博客:  ...

  10. 使用PHP对word文档进行操作的方法

    使用php时,因为加密等原因,如果直接用FILE后者OPEN等函数读取WORD的话往往是乱码,原来要使用COM 这是我简单的一个读取并存储到新的WORD上的文件<? // 建立一个指向新COM组 ...