JavaScript学习心得06
Posted endymion
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript学习心得06相关的知识,希望对你有一定的参考价值。
Object()
- 如果参数是各种原始类型的值,转换成对象就是原始类型值对应的包装对象:
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之静态方法(本身的方法)分类
- 对象属性模型的相关方法;
- 控制对象状态的方法;
- 原型链方法。
Object.prototype.toString可以看出一个值到底是什么类型
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]”
属性描述对象attributes object
- 有六个元属性,每一个对象的每一个属性都拥有一个属性描述对象:
value
:属性值;writable
:是否可写?enumerable
:是否可遍历?configurable
:是否可配置该属性描述对象?get
:每次读取该属性,都会调用这个取值函数。set
。
注意,
Object.getOwnPropertyDescriptor
方法只能用于对象自身的属性,不能用于继承的属性。一旦定义了取值函数
get
(或存值函数set
),就不能将writable
属性设为true,或者同时定义value
属性,否则会报错。如果对象的 JSON 格式输出要排除某些属性,就可以把这些属性的
enumerable
设为false。
configurable的爱恨情仇
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 } })
以上是关于JavaScript学习心得06的主要内容,如果未能解决你的问题,请参考以下文章