无序属性的集合,其属性可以包含基本值、对象或者函数。
对象的每一个属性和方法都有一个名字,而每个属性和方法都映射一个值。
重点:一个指针,只关心东西在哪里。不会关心是什么值。还有就是尽量不要破坏指针,如···指针赋予新的实例,
疑问:
1.数据属性与访问器属性怎么区分啊?为什么会有这两种?
理解对象:
一、数据属性:Object.defineProperty(object,property,descriptor)
1.configurable 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。
2.enumberable 表示能否通过for-in循环返回属性。
3.writable 表示能否修改属性的值
4.value 包含这个属性的数据值,默认为undefine
var test = { 'name' : 'lfy' , 'sex' : '男' } ; delete test.name; console.log(test) /* { 'sex' : '男' } */
二、访问器属性:Object.defineProperty(object,property,descriptor)
2.enumberable 表示能否通过for-in循环返回属性。
3.get 在获取属性时调用的函数,默认undefined
4.set 在写入属性时调用的函数,默认undefined
定义单个属性↓
var test = { year: 2004 };
Object.defineProperty(test,'newYear',{ get : function(){ return this.year }, set: function(Anew){ if( Anew > this.year){ this.year = Anew; console.log(Anew) } } }) test.newYear = 2006
定义多个属性↓
var test = {};
Object.defineProperties(test,{
name:{
writable : true;
value : 'lfy'
},
sex : {
writeable : true ;
value : '男'
},
year : {
get :function(){
return 1996;
},
set : function(newValue){
if( newValue > 1996){
console.log(newValue)
}
else{
console.log(‘新赋予的值小于1996’)
}
}
}
})
读取属性的特性↓
三、创建对象
没有显式的创建对象,
直接将属性和方法赋给this对象。
没有return语句.
③调用构造函数的步骤:
创建一个新对象
将构造函数的作用域赋给新对象(因此this就指向了这个对象)
执行构造函数中的代码(为这个对象添加属性)
返回新对象
④定义方法的不足;
每个构造函数新实例都包含一个不同的Function实例。(定义两个完成统一任务的function实例时,没有必要。)
解决办法:方法指向构造函数外面。当执行这个方法时创建的是Function实例
该解决办法的缺点:在全局作用域创建的函数,只能被某个对象调用。如果对象定义了多个方法,要定义多个全局函数。丝毫没有封装性。
3.3、原型模式:通过调用构造函数创建的那个对象实例的原型对象
①只要创建一个函数,就会产生一个prototype属性,该属性指向函数的原型对象。
②原型对象会自动获得一个constructor属性,该属性指向prototype属性所在的函数。
③当调用构造函数创建一个新的实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象 : _proto_
④更简单的原型写法:以对象字面量的形式创建新对象取代(每写一个属性或方法,就要写一个prototype)
不足:重新定义了prototype对象,需要在新对象里面添加属性{ constructor : <构造函数> }
constructor的[[Enumerable]]特性,默认false,不可for-in循环。被设置为true,可for-in循环。
⑤原型的动态性:一个指针,只关心东西在哪里。不会关心是什么值。
对原型对象所做的任何修改都能够立即从实例上反映出来。(原因:将一个构造函数实例化以后,拥有构造函数的属性以及原型对象。且实力与原型对象之间的连接只不过是一个指针,所以修改原型对象,可以立即反映出来。)
自翻译:
原型对象的方法:Test.prototype.isPrototypeOf(XX) Test构造函数的prototype属性指向的原型对象,是XX的原型对象。
ECMA5增加的方法:Object.getPrototypeOf(XX) 获得XX的_proto_
Object方法:Test.hasOwnPropoty('name') 检测name属性是实例属性,还是原型属性。
'name' in object; 存在实例中或者存在原型中,都返回true;
Object.keys(XX) 获得XX所有可枚举的实例属性。
Object.getOwnPropertyNames(XX) 获得XX所有实例属性。 如:不可枚举的constructor属性,caller等