- JS 中对象的种类 ?
- JS 内置的对象(如 Number 等)。
- 宿主环境对象(如 window,document 等)。
- 自己创建的对象 。
- 在 JS 中怎么创建对象 ?
字面量形式创建对象(属性,方法,get,set 型属性)。
成员访问:两种访问方式(. [])。访问对象中没有的属性时,会返回 undefined。级联访问(对象里面嵌套对象)。
/* 字面量创建对象 */
var student = {
// 属性
'name': 'wuhao',
'age': 22,
// 方法
'toString': function(){
console.log('姓名:'+this.name+' 年龄: '+this.age);
},
// get 和 set 方法
getName: function(){
return this.name;
},
setName: function(val){
this.name = val;
},
// 内部子对象
self: {
'name': 'my',
'age': 18
}
}
console.log(student.getName())
console.log(student['age'])
student.setName('wangwenyan')
console.log(student.name)
student.toString()
console.log(student['self']['name'])
console.log(student.self.age)
Object 函数创建对象,Object.defineProperty 定义与修改属性。Object.defineProperties 定义和修改多个属性。还可以用o.xxx='xxx' 或者 o['xxx']='xxx' 去新增属性。
/* Object创建对象 */
var o = new Object();// 内部已存在 toString 等内部方法
/* 使用 Object.defineProperty() 定义与修改单个属性 */
Object.defineProperty(o,'name',{value:'张三',writable:false})
console.log(o.name)
/* 使用 Object.ddefineProperties() 定义与修改多个属性 */
Object.defineProperties(o,{
salary:{
// get,set,writable,enuerable,comfigurable,value
value:1000,
writable:false
},
gender:{
value:true
},
height:{
get:function(){
return 180
},
set:function(val){
console.log(val)
}
}
})
console.log(o['salary'])
console.log(o['gender'])
o.age = 19
o['stuno'] = '1704240131'
console.log(o.age)
console.log(o.stuno)
console.log(o.height)
o.height=234
对象工厂方式(构造函数),创建对象。
这里涉及到原型相关的知识。
- 每个函数都有 prototype 属性,指向它的原型对象。在使用构造函数创建的对象,有 __proto__ 属性,指向它的原型对象。在原型对象中有 constrctor 属性,指向构造函数。
- 在访问对象属性或者方法时,会先在创建的对象本身去找,如果没有找到的话,就会通过对象中的 __proto__ 属性,访问在它的原型对象上去寻找。循环向上查找访问。
- 在原型对象中,又包含 __proto__ 属性,可以指向它原型对象的上层原型对象,一直循环找,直到找到 Object 对象,原型指向为 null,为顶层。
【JS原型的作用】:可以把公共的属性和方法,加到原型对象中,新创建对象时,可以 节省内存空间。后续的 继承,基于原型,形成原型链去实现。
function Person(name,age){
this.name = name;
this.age = age;
Person.prototype.toString = function(){
console.log('姓名:' + this.name + ' 年龄: '+ this.age);
}
}
var per = new Person('wuhao',21);
console.log(per.name)
console.log(per.age)
per.toString()
- 自己实现 new ?
function Person(name, age){// Person 类
this.name = name
this.age = age
}
var person = new Person('wuhao',23)// 使用JS本身提供的 new
console.log(person.name)
console.log(person.age)
console.log(person instanceof Person)
function New(f){// f 是个构造器函数,形成闭包,f 和 var o = {"__proto__":f.prototype} 外部变量
var o = {"__proto__":f.prototype}
return function(){
f.apply(o,arguments)// 对象中新增属性
return o
}
}
var person1 = New(Person)('xiner',20)// 使用自己实现的 New
console.log(person1.name)
console.log(person1.age)
console.log(person1 instanceof Person)
- JS 对象的基本操作 ?
- 成员的遍历: for(el in o),反射性遍历,无序。可以使用 Object.keys(o) 辅助排序,进行有序操作。
- 检查对象是否有某个值:'xxx' in o 或者 o.hasOwnProperty('xxx') 。
- 成员的删除:delete o.'xxx' ,有些属性是不能删除的 。
- JS 对象成员特性 ?
- writable:规定是否可改写。
- enuerable:规定是否可枚举(决定遍历时是否出现)。
- configurable:规定是否可配置 。
- 通过 Object.getOwnPropertyDescriptor(o,'xxx') 得到自己属性的描述器。
- 类型判断:typeof 和 instanceof 。