var obj = Object(1);
obj instanceof Object // true
obj instanceof Number // true
var obj = Object(‘foo’);
obj instanceof Object // true
obj instanceof String // true
var obj = Object(true);
obj instanceof Object // true
obj instanceof Boolean // true
//利用这一点,可以判断一个变量是否为对象
function isObject(value) {
return value === Object(value);
}
isObject([]) // true
isObject(true) // false
Object.keys()
和Object.getOwnPropertyNames()
返回的结果是一样的。只有涉及不可枚举属性时,才会有不一样的结果。Object.keys
方法只返回可枚举的属性,Object.getOwnPropertyNames
方法还返回不可枚举的属性名。var obj = {
p1: 123,
p2: 456
};
Object.keys(obj).length // 2
Object.prototype.toString.call(2) // “[object Number]”
Object.prototype.toString.call(‘’) // “[object String]”
Object.prototype.toString.call(true) // “[object Boolean]”
Object.prototype.toString.call(undefined) // “[object Undefined]”
Object.prototype.toString.call(null) // “[object Null]”
Object.prototype.toString.call(Math) // “[object Math]”
Object.prototype.toString.call({}) // “[object Object]”
Object.prototype.toString.call([]) // “[object Array]”
value
:属性值;writable
:是否可写?enumerable
:是否可遍历?configurable
:是否可配置该属性描述对象?get
:每次读取该属性,都会调用这个取值函数。set
。注意,Object.getOwnPropertyDescriptor
方法只能用于对象自身的属性,不能用于继承的属性。
一旦定义了取值函数get
(或存值函数set
),就不能将writable
属性设为true,或者同时定义value
属性,否则会报错。
如果对象的 JSON 格式输出要排除某些属性,就可以把这些属性的enumerable
设为false。
configurable
为false时,value
、writable
、enumerable
和configurable
都不能被修改了;configurable
为false时, writable
在false改为true会报错,true改为false是允许的;configurable
和writable
有一个是true,就可以通过Object.defineProperty
方法来改value
;configurable
为false时,不能直接通过目标属性赋值来修改value
;configurable
设为false时,该属性不能被删除;setter
还有getter
呢?有两种写法:
Object.defineProperty
方法来修改set
和get
:var obj = Object.defineProperty({}, ‘p’, {
get: function () {
return ‘getter’;
},
set: function (value) {
console.log(‘setter: ‘ + value);
}
});
obj.p // “getter”
obj.p = 123 // “setter: 123”
var obj = {
get p() {
return ‘getter’;
},
set p(value) {
console.log(‘setter: ‘ + value);
}
};
var extend = function (to, from) {
for (var property in from) {
//过滤掉继承的属性,因为getOwnPropertyDescriptor读不出继承属性
if (!from.hasOwnProperty(property)) continue;
Object.defineProperty(
to,
property,
Object.getOwnPropertyDescriptor(from, property)
);
}
return to;
}
extend({}, { get a(){ return 1 } })
// { get a(){ return 1 } })
原文:https://www.cnblogs.com/endymion/p/9208342.html