Vue不兼容IE8原因以及Object.defineProperty详解
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方法, 不允许使用
writable和value这两个属性
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详解的更多相关文章
- IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)
来源: http://www.cnblogs.com/JustinYoung/archive/2009/04/03/kaifarenyuangongju2.html 在上一篇文章IE8“开发人员工具” ...
- IE8“开发人员工具”使用详解上(各级菜单详解)
来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...
- vue.js循环for(列表渲染)详解
vue.js循环for(列表渲染)详解 一.总结 一句话总结: v-for <ul id="example-1"> <li v-for="item in ...
- Vue通信、传值的多种方式,详解
Vue通信.传值的多种方式,详解 转自:https://blog.csdn.net/qq_35430000/article/details/79291287 一.通过路由带参数进行传值 ①两个组件 A ...
- vue.js选择if(条件渲染)详解
vue.js选择if(条件渲染)详解 一.总结 一句话总结: v-if <!DOCTYPE html> <html lang="en"> <head& ...
- 【转载】html中object标签详解
[转载自http://blog.csdn.net/soliy/archive/2010/03/22/5404183.aspx] html标签之Object标签详解 作者:网络 出处:网络 ...
- Vue通信、传值的多种方式,详解(都是干货)
Vue通信.传值的多种方式,详解(都是干货) 可参考博客: https://blog.csdn.net/qq_35430000/article/details/79291287
- JAVA中Object类方法详解
一.引言 Object是java所有类的基类,是整个类继承结构的顶端,也是最抽象的一个类.大家天天都在使用toString().equals().hashCode().waite().notify() ...
- Vue双向绑定的关键:Object.defineProperty()
这个方法了不起啊.vue.js和avalon.js 都是通过它实现双向绑定的.而且Object.observe也被草案发起人撤回了.所以defineProperty更有必要了解一下了. 先上几行代码看 ...
随机推荐
- C语言的一些特殊使用方法————————【Badboy】
一:特殊的字符串宏 [cpp] #define A(x) T_##x #define B(x) #@x #define C(x) #x 我们如果x=1, 则上面的宏定义会被解释成下面的样子 A(1)- ...
- RDLC后台自己定义报表模板
首先封装一个公共类,统一来操作RDLC报表 using System; using System.Collections.Generic; using System.Linq; using Syste ...
- MD5加密实现类不是Windows平台下联邦信息处理标准验证过的加密算法的一部分
在.NET应用程序中,MD5CryptoServiceProvider实例化时,造成This implementation is not part of the Windows Platform FI ...
- object equal
package equals; public class EqualsTest { public static void main(String[] args) { Employee alice1 = ...
- Android IntentService的使用和源代码分析
引言 Service服务是Android四大组件之中的一个,在Android中有着举足重轻的作用.Service服务是工作的UI线程中,当你的应用须要下载一个文件或者播放音乐等长期处于后台工作而有没有 ...
- id、NSObject *、id<NSObject>、instancetype
1. id 与 NSObject * (1) id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的 ...
- SQL Server 2012 安装图解教程(附sql2012下载地址)
在安装微软最新数据库SQL Server 2012之前,编者先确定一下安装环境:Windonws 7 SP1,32位操作系统.CPU是2.1GHz赛扬双核T3500,内存2.93GB. sql2012 ...
- kbmMW 5.0.1发布了(跨全平台,包括Linux,可使用Win的高性能HTTPSys传输层,等等)
kbmMW5如期发布,作者增加了很多重磅功能,以下翻译作者的发布文件:1.支持Delphi 10.2 Tokyo,包括Linux支持(测试版)2.大量的新功能与改进3.新的智能服务(Smart ser ...
- Hihocoder #1077 : RMQ问题再临-线段树(线段树:结构体建树+更新叶子往上+查询+巧妙使用father[]+线段树数组要开大4倍 *【模板】)
#1077 : RMQ问题再临-线段树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到:小Hi给小Ho出了这样一道问题:假设整个货架上从左到右摆放了N种商品,并 ...
- HDU4283 You Are the One —— 区间DP
题目链接:https://vjudge.net/problem/HDU-4283 You Are the One Time Limit: 2000/1000 MS (Java/Others) M ...