Object.create()是E5的一个新特性,用于创建一个具有指定原型且可选择性地包含指定属性的对象,其实可以理解为继承一个对象。
Object.create(prototype, descriptors)
//prototype:必需。 要用作原型的对象,如果没有则传为 null。
//descriptors:可选。 包含一个或多个属性描述符的 JavaScript 对象。
var newObj = Object.create(null, {
name: {
value: "newObj",
enumerable: true,
},
});
console.log(newObj);//{name: "newObj"}
说明:使用null创建的是一个空对象,不会具备Object.prototype 原型链上的属性或者方法,比如toString()和valueOf()。通过设置enumerable:true来表明newObj的name属性为可枚举的,其值为newObj。
var obj1=Object.create(Object.prototype);
这样创建的对象等价于:
var obj2={};
var obj3=new Object();
console.log(obj1.__proto__===obj2.__proto__);//true
console.log(obj1.__proto__===obj3.__proto__);//true
writable:是否可任意写,表示能否修改value值
configurable:是否可配置,表示能否通过delete删除属性从而重新定义属性
enumerable:是否可枚举,能用 for in 枚举
value:值
configurable:是否可配置,表示能否通过delete删除属性从而重新定义属性
enumerable:是否可枚举
get:在读取属性时调用的函数,默认是undefined
set:在写入属性时调用的函数,默认是undefined
var obj = {
a:function(){
console.log('a');
},
}
var newObj= Object.create(obj,{
n1:{
value:'n1',
writable:false,//不可写
configurable: false,//不可删除属性从而重新定义属性;
},
n2: {
configurable: false,
get: function() { return n2; },
set: function(value) { n2=value }
}
})
console.log(newObj.a());//输出a
console.log(newObj.n1);//输出n1
newObj.n1='hellow'
console.log(newObj.n1);//输出n1,这里由于设置了writable:false,//不可写,所以修改不了newObj.n1它的值
newObj.n2='haha';
console.log(newObj.n2);
Object.defineProperty(newObj,'n1',{
configurable: true,
enumerable: true,
});//报错:Uncaught TypeError: Cannot redefine property: n1
可以看出:我们可以通过Object.defineProperty方法重新修改属性,但是如果将configurable设置为false,将不能再调用Object.defineProperty()对属性的行为进行修改,除了writable 只能修改为 false。
Object.create在某些浏览器没有支持,需要给出Object.create的兼容实现:
// 参考JavaScript高级程序设计中的原型式继承
Object.prototype.create = function(obj) {
if(Object.prototype.create){
return Object.prototype.create //特性检测,判断浏览器是否兼容
}else{
function F(){ F.prototype = obj; //以传入参数为原型构造对象
return new F(); } } };
说明:
Object()函数内部先创建了一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回了这个临时类型的新实例。
从本质上讲object()对传入其中的对象执行了一次浅复制。
在JavaScript中的所有对象都是继承Object对象而来的, 我们可以理解为Object是所有js对象通用的功能,讲解Object的prototype属性、Object.prototype属性和方法?Object.prototype.constructor属性等
相等是JavaScript中起初最让人困惑的部分。==和===的比较、强制类型的顺序等等,都使得这个问题变得复杂。今天,我们会聚焦另一个方面:object相等是如何实现的。
还能通过 Object.defineProperty() 方法,添加或修改对象的属性。更重要的是,除了目标对象 obj,属性名称 prop 外,方法能传入属性描述符 descriptor,以实现更复杂的性质。属性描述符是一个对象,有两种形式:一种是数据描述符,另一种是存取描述符。
Object的defineProperty和defineProperties这两个方法在js中的重要性十分重要,主要功能就是用来定义或修改这些内部属性,与之相对应的getOwnPropertyDescriptor和getOwnPropertyDescriptors就是获取这行内部属性的描述。
Object.defineProperty()该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象,Object.defineProperties()该方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 。
Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。
本文实例讲述了JS Object.preventExtensions(),Object.seal()与Object.freeze()用法。分享给大家供大家参考,Object.preventExtensions 只能阻止一个对象不能再添加新的自身属性,仍然可以为该对象的原型添加属性。
什么是浅拷贝?浅拷贝就是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。浅拷贝Object.assign()是什么?主要将所有可枚举属性的值从一个或者多个数据源对象复制到目标对象,同时返回目标对象。
访问对象属性的两种方法:a:objectName.PropertyName 对象名.属性名;This关键字:在普通函数下This指向的是window;对象的创建方法:通过对象字面量的形式创建对象
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!