Object构造函数
JavaScript中的所有对象都来自
Object
;所有对象从
Object.prototype
继承方法和属性,尽管它们可能被覆盖。例如,其他构造函数的原型将覆盖
constructor
属性并提供自己的
toString()
方法。
Object
原型对象的更改将传播到所有对象,除非受到这些更改的属性和方法将沿原型链进一步覆盖。

Object.prototype对象原型上的方法
Object.prototype
可以为所有 Object 类型的对象添加属性,对象原型,上面有封装好的方法。可以供所有的对象继承使用。
(1)Object.prototype.constructor
构造函数 指向Object
(2)Object.prototype.hasOwnProperty
判断是否是自身的属性,所有对象继承该属性,对象可以直接调用hasOwnProperty,来判断对象上是否有某个属性,比如:
var obj = {name: "zhu"};
console.log(obj.hasOwnProperty("name")); true
可以结合for in,来遍历获取对象自身的属性和属性值。
(3)Object.prototype.toString方法
对象原型的该toString方法可以来识别数据类型,而且每个对象也继承了该toString方法,该方法的详细介绍在“数据类型的toString”有介绍
Object上的两个工具方法
(1)Object.assign()浅复制对象 兼容性:Edge12 ES6
Object.assign()
方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
Object.assign
方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的
[[Get]]
和目标对象的
[[Set]]
,所以它会调用相关 getter 和 setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。
如果属性不可写,会引发
TypeError
,如果在引发错误之前添加了任何属性,则可以更改
target
对象。
Symbol
类型的属性都会被拷贝,字符串也会作为一个对象进行拷贝。
var sym = Symbol('foo'); //Symbol(foo)
var str = "abc";
var obj = {
name: "zhu",
age: 24,
s: sym
}
var dict = Object.assign({},str,obj);
console.log(dict); {0: "a", 1: "b", 2: "c", name: "zhu", age: 24, s: Symbol(foo)}
console.log(sym); Symbol(foo)
Object.assign()
拷贝的是(可枚举)属性值。假如源值是一个对象的引用,它仅仅会复制其引用值。
异常会打断后续的copy,但前面的copy是成功的,比如一个对象,一部分属性已经copy了,发生异常后,后续停止copy,而前面的属性copy成功。
原始类型会被包装,null 和 undefined 会被忽略。注意,只有字符串的包装对象才可能有自身可枚举属性。
(2)Object.is()判断两个值是否相等 Edge12 ES6
判断两个值是否相同。如果下列任何一项成立,则两个值相同:
- 两个值都是
undefined
- 两个值都是
null
- 两个值都是
或者都是true
false
- 两个值是由相同个数的字符按照相同的顺序组成的字符串
- 两个值指向同一个对象
- 两个值都是数字并且
- 都是正零
+0
- 都是负零
-0
- 都是
NaN
- 都是除零和
外的其它同一个数字NaN
- 都是正零
这种相等性判断逻辑和传统的
==
运算不同,
==
运算符会对它两边的操作数做隐式类型转换(如果它们类型不同),然后才进行相等性比较,(所以才会有类似
"" == false
等于
true
的现象),但
Object.is
不会做这种类型转换。
这与
===
运算符的判定方式也不一样。
===
运算符(和
==
运算符)将数字值
-0
和
+0
视为相等,并认为
Number.NaN
不等于
NaN
。
兼容性:Edge12
兼容性写法:
if (!Object.is) {
Object.is = function(x, y) {
// SameValue algorithm
if (x === y) { // Steps 1-5, 7-10
// Steps 6.b-6.e: +0 != -0
return x !== 0 || 1 / x === 1 / y;
} else {
// Step 6.a: NaN == NaN
return x !== x && y !== y;
}
};
}
1、ES5的方法,兼容IE9
这两个方法,在“数据属性和访问器属性”中有介绍
(1)Object.defineProperty()
Object.defineProperty(obj, prop, descriptor)
给对象添加一个属性并指定该属性的配置。
(2)Object.defineProperties()
var obj = {};
Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
},
'property2': {
value: 'Hello',
writable: false
}
// etc. etc.
});
给对象添加多个属性并分别指定它们的配置。
(3)Object.getOwnPropertyDescriptor()
方法返回指定对象上一个自有属性对应的属性描述符
如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回
undefined
。
比如,
正常的对象属性
o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
d {
configurable: true,
enumerable: true,
value: 42,
writable: true
}
通过defineProperty设置的对象属性
o = {};
Object.defineProperty(o, "baz", {
value: 8675309,
writable: false,
enumerable: false
});
d = Object.getOwnPropertyDescriptor(o, "baz");
d = {
value: 8675309,
writable: false,
enumerable: false,
configurable: false
}