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
}