类型介绍之(2)引用类型
Object类型
是什么?
一组无序的名值对儿。
定义:
var obj = new Object();
var obj = {};
在这个过程中发生了什么?
先使用构造一个Object类型的实例对象。
1.设置constructor属性,设置为Object这个Function
2.设置__proto__属性,设置为Object.prototype的值。这个属性是Chrome内部使用,可以取,不能设置。
自定义类型,派生自Object
function Person(name){
this.name = name;
}
声明了一个Function,这个Funtion的Prototype属性指向的对象如何创建
js会生成一个obj
1.设置constructor属性,设置为Person这个Function
2.设置__proto__属性,设置为Object.prototype的值。
Person.prototype自动指向这个对象。
var person = new Person('zhangsan');
这个过程发生什么?
1.在走用户的Person这个函数代码之前,先干这样一些事。
构造一个对象
1.设置constructor属性,设置为Person这个Function
2.设置__proto__属性,设置为Person.prototype的值。这个属性是Chrome内部使用,只能取。
3.修改this为这个对象
2. 开始执行用户的代码
3. 用户代码执行完之后,返回this,即那个对象
如何给对象上加属性?
1.定义数据属性
Object.defineProperty(person,'name',{
configurable: true,
writable: true,
enumerable: true,
value:'lalala'
});
简化写法:
Object.defineProperty(person,'name',{
value:'lalala'
});
进一步简化 (最贴近实际的用法):
person.name = 'lalala';
person = {
name:'lalala'
};
2.定义访问器属性
var secret = 'aaa';;
Object.defineProperty(this,'secretForGood',{
enumerable:true,
configurable:true,
get:function(){
return secret;
},
set:function(value){
secret = value;
}
});
简化写法:
var secret = 'aaa';;
Object.defineProperty(this,'secretForGood',{
get:function(){
return secret;
},
set:function(value){
secret = value;
}
});
3.批量定义属性
Object.defineProperties(this, {
address: {
writable: false,
value: 'xian'
},
personality: {
get: function () {
return personality;
}
}
});
4.获取属性定义配置信息
1.只要这个对象能以某种手段最终取到这个属性,并且属性配置可枚举的,就能枚举出来
for(var proto in obj){
//...
}
2.仅能获取对象本身的属性,并且配置是可枚举的,但不会去__proto__上继续搜索
Object.getOwnPropertyDescriptor(goodPerson,'personality');
Object.keys(goodPerson) 获取对象本身的实例属性(仅可枚举的)
Object.getOwnPropertyNames(goodPerson)获取对象本身的实例属性(所有)
Object作为所有引用类型的基类,它的原型上面记载了什么方法?
Object.prototype.hasOwnProperty('name')
Object.prototype.isPrototypeOf(obj)
Object.prototype.propertyIsEnumerable('name')
Object.prototype.toLocaleString()
Object.prototype.toString()
Object.prototype.valueOf()