一:对象的创建
js中的对象创建比较灵活,正因为比较灵活,所以灵活使用难度较大.
- 使用new Object关键字
var Person =new Object( {
name:"liming",
age:20,
people:{sense:"Hello,World",t:function(){return "I am t"}},//对象里面可以嵌套对象
test:function(){
return this.name+this.age;
}
} )
delete Person.name;//删除对象的属性,一般格式为delete object.property(method)或者object.property(method)=undefined
Person.hobby="football";//添加对象的属性,直接object.property="xxx"
Person.hobby="basketball";//修改对象的属性,直接object.property="xxx"
注意:new Object 可以省略,此方法为object的对象
- 构造函数法
function Test() //大写,与其他函数办法区分
{
var ownSex="女";//私有属性,只能自己访问
this.name="liming";//公有属性,都可以访问
this.age=20;
this.setSex=function(ownAge){//通过设置获得私有属性
age=ownAge;
}
this.getSex=function(){//通过方法获得私有属性
return age;
}
function test()//私有方法的属性获得需要改变指针,后续扩展。
{
console.log("xxx")
}
}
var t=new Test()
console.log(t.name) //liming
t.setSex("男");
console.log(t.getSex())//男
- 原型法
function Test() //大写,与其他函数办法区分
{
}
Test.prototype.name="liming",
Test.prototype.age=20
Test.prototype.f=function()
{
return "xx";
}
var t=new Test()
console.log(t.name) //liming
console.log(t.age)//20
console.log(t.f())
- ECMAScript增强的对象模型
ECMAScript增强的对象模型增强了对象模型的控制力度,可以控制读取,写入,删除,枚举等等。
/*
此函数需要在严格模式下执行,如firefox=4,此外该方法支持多种属性一起写,支持set,get方法。
Object.defineProperty(obj,prop,desc)
@param {
obj:对象
prop,字符串类型,用于指定属性名
desc,对象,包含了对属性的描述
} */
function Person()
{
}
Object.defineProperty(
Person.prototype,"niceName",{
value:"test",
writable:true, //决定属性能否被赋值。
configurable:false,//决定该属性能否被删除或者改变特征值。
enumerable:true,//:决定 for in 能否枚举该属性。
}
)
new Person().niceName="x5x"
console.log(new Person().niceName)//test
-
Object.create(带扩展,想不明白)
-
ES6 中的类
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ' makes a noise.');
}
}
let A=new Animal("test")
A.speak();//test makes a noise.
二:遍历对象
- for…in 可以获取自身可以枚举除symbol外的属性和原型属性
function Person()
{
this.name="liming",
this.age=20
}
Person.prototype.test="test"
var p=new Person()
for(item in new Person())
{
console.log(item)//name age test
}
- Object.keys 和 Object.values 都只可以获取自身除了symbol外可枚举的属性和值不能获得原型链的
function Person()
{
this.name="liming",
this.age=20
}
Person.prototype.test="test"
var p=new Person()
console.log(Object.keys(p))//name age
console.log(Object.values(p))//liming 20
- Object.getOwnPropertyNames(obj)
可以列出所有能枚举和不能枚举的属性,比object.keys()方法稍强,但不是不能实现向前兼容,因为ECMAScript3没有相关方法可以获得不能枚举的属性
function Person()
{
this.name="liming",
this.age=20
}
Person.prototype.test="test"
var p=new Person()
console.log(Object.getOwnPropertyNames(p));//name test
三:密封对象和动态对象
-
密封对象不允许添加成员
Object.preventExtensions(obj)//严格模式下才可以执行 -
密封对象不允许添加成员和删除成员
Object.seal(obj)//严格模式下才可以执行
Object.isSealed(obj)//严格模式下执行 -
完全密封对象都是严格模式下才可以看到