对整个对象的设置:
Object.preventExtensions方法: 不可增加新属性。
var obj = {
x: 1,
y: 2,
}
obj.a = 3;
Object.preventExtensions(obj);
obj.b = 4;

Object.seal方法: 不可增加新属性和不可设置特性。
var obj = {
x: 1,
y: 2,
}
obj.a = 3;
Object.seal(obj);
Object.defineProperty(obj, "x", {
writable: true,
enumerable: false,
configurable: true,
})

Object.freeze方法: 不可增加新属性、不可设置特性和不可修改属性值。
var obj = {
x: 1,
y: 2,
}
obj.a = 3;
Object.freeze(obj);
obj.x = 10;
obj.b = 20;

查看特性的方法: 如果是则返回true, 不是则返回false。
Object.isExtensible;
Object.isSealed;
Object.isFrozen;
以上一段代码为列:

作用: 包含对象。
克隆对象:
浅克隆:
// 最简单浅克隆
var obj = {
x: 1,
y: 2,
}
obj1 = {};
for(var i in obj) {
obj1[i] = obj[i];
}

问题: 假设obj上的属性中有一个是对象,当在obj上修改了属性中对象的属性的值,克隆的obj1上的也会改变。

变成了指针的赋值。
深度克隆:
var obj = {
x: 1,
y: {
a: 10,
}
}
obj1 = {};
function clone(obj) {
var cloneobj = {};
for(var i in obj) {
if( typeof obj[i] == "object" ) {
cloneobj[i] = clone(obj[i])
}
else cloneobj[i] = obj[i];
}
return cloneobj;
}

原型克隆:
var obj = {
x: 1,
y: {
a: 10,
}
}
function clone1(obj) {
function Temp() {}; // 写一个构造函数
Temp.prototype = obj; // 让原型继承克隆的对象
return new Temp();
}

虽然是实例,但是可以直接使用。
---------------------------------再修改一下深度克隆---------------------------
判断字符、数组、对象。
如果是字符、数字、布尔、函数直接return;如果是数组,需要遍历,如果数组中还有对象,那使用刚刚的方法。
function clone(obj) {
if(obj instanceof Array) {
var ary = [];
for(var i=0; i<obj.length; i++) {
ary[i] = clone(obj[i]);
// 这个也是使得递归到字符、数字、布尔、函数。
}
return ary;
}
if(obj instanceof Object) {
var newObj = {};
for(var key in obj) {
console.log(typeof key)
newObj[key] = clone(obj[key]);
// 新对象应对的值要重新拿进来再判断一下,
// 如果是值是字符,会直接return给值,如果是对象就再递归。
}
return obj
}
return obj
}