Object.freeze() 方法小记

简介: 在vue中的应用:如果你有一个巨大的数组或Object,并且确信数据不会修改,可以使用 Object.freeze() 方法冻结该数据,这样vue就不会对该对象的getter和setter做转换,从而让性能得以大幅提升。

在vue中的应用:如果你有一个巨大的数组或Object,并且确信数据不会修改,可以使用 Object.freeze() 方法冻结该数据,这样vue就不会对该对象的getter和setter做转换,从而让性能得以大幅提升。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="app">
        <span v-for="item in list">{{item.name}}</span>
    </div>
    <script type="text/javascript" src="../../../js/lib/vue-2.5.21.js"></script>
<script>
    'use strict'
    new Vue({
        el: '#app',
        data() {
            return {
                list: Object.freeze([{
                    name: '1'
                }, {
                    name: '2'
                }])
            }
        },
        mounted() {
            this.list[0].name = '3' // 不会生效
              // 如果直接改变this.list 的引用,就会生效
              this.list = [{name: 4}] 
              // 或
              this.list = Object.freeze([{name: 4}])
        }
    })
</script>
</body>
</html>

Object.freeze()

Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。

var obj = {
  prop: function() {},
  foo: 'bar'
}
// 正常我们可以修改属性值或者删除属性
obj.foo = 'bas'
obj.lumpy = 'woof'
delete obj.prop

当obj被冻结后
var o = Object.freeze(obj)
o === obj // true

// 现在任何改变都会失效
obj.foo = '23' // 静默地不会做任何事,在严格模式下会抛出错误 TypeErrors
// 试图通过 Object.defineProperty 更改属性
// 下面两个语句都会抛出 TypeError.
Object.defineProperty(obj, 'ohai', { value: 17 });
Object.defineProperty(obj, 'foo', { value: 'eit' });

// 也不能更改原型
// 下面两个语句都会抛出 TypeError.
Object.setPrototypeOf(obj, { x: 20 })
obj.__proto__ = { x: 20 }

同样数组也会被冻结
let a = [0];
Object.freeze(a); // 现在数组不能被修改了.

a[0]=1; // fails silently
a.push(2); // fails silently

// In strict mode such attempts will throw TypeErrors
function fail() {
  "use strict"
  a[0] = 1;
  a.push(2);
}

fail();

冻结对象为浅冻结
相关文章
|
3月前
|
JavaScript 前端开发
【面试题】 JS手写ES6的Object.create方法
【面试题】 JS手写ES6的Object.create方法
|
6月前
|
Java
【面试题精讲】Object类的常见方法有哪些?
【面试题精讲】Object类的常见方法有哪些?
|
1月前
|
设计模式 Java 调度
多案例理解Object的wait,notify,notifyAll与Thread的sleep,yield,join等方法
多案例理解Object的wait,notify,notifyAll与Thread的sleep,yield,join等方法
43 1
|
1月前
|
JavaScript
JS之Object.defineProperty方法
JS之Object.defineProperty方法
|
3月前
|
存储 JavaScript 前端开发
【JavaScript】<面向对象Object>函数方法&对象创建&原型对象&作用域解析
【1月更文挑战第17天】【JavaScript】<面向对象Object>函数方法&对象创建&原型对象&作用域解析
|
3月前
|
JavaScript 前端开发
如何巧妙使用`Object.keys`方法将`JS`的一个对象的特定的值赋值给另外一个对象
如何巧妙使用`Object.keys`方法将`JS`的一个对象的特定的值赋值给另外一个对象
17 0
|
6月前
|
前端开发 索引
Object中常用的方法
Object中常用的方法
20 0
|
8月前
|
JavaScript 前端开发 API
Vue数据监听Object.definedProperty()方法的实现
Vue数据监听Object.definedProperty()方法的实现
|
8月前
|
Java
Java-对对象的拷贝、抽象类和接口的区别、Object类、对象的比较方法和内部类(下)
Java-对对象的拷贝、抽象类和接口的区别、Object类、对象的比较方法和内部类(下)
40 0
|
8月前
|
Java 编译器
Java-对对象的拷贝、抽象类和接口的区别、Object类、对象的比较方法和内部类(上)
Java-对对象的拷贝、抽象类和接口的区别、Object类、对象的比较方法和内部类(上)
52 0