1.普通函数和构造函数的区别
1.普通函数:做业务处理 ;构造函数:自定义实例化对象
2.构造函数首字母大写
1.1new操作符做了什么?
使用new 关键字在调用函数时,函数的内部会自动创建一个新的对象
将函数的作用域赋给新的对象(this会指向新的对象)
执行函数的代码(添加属性和方法)
返回新对象(实例化对象)
如果返回的是基本数据类型,就会忽略,如果是引用数据类型就会以返回的结果为准
2.创建对象的方式
2.1 字面量
var obj ={
username:'张三',
age:18,
sayHi:function(){
console.log('Hi')
}
}
2.2使用new关键字
var obj2 = new Object();
obj2.name = 'zhangmeili';
obj2.age = 18;
obj2.sex = '女';
obj2.sayHi = function(){
alert('今天很开心');
}
2.3使用构造函数创建
function Rotbot(fname, age, sex) {
this.fname = fname;
this.age = age;
this.sex = sex;
this.sayHi = function() {
console.log('我一直在');
}
}
// 实例化对象
var rot1 = new Rotbot('小爱同学', 5, false);
console.log(rot1.fname);
console.log(rot1.sayHi());
3.遍历对象
3.1使用for-in遍历
var robot = {
fname: '小爱同学',
age: 5,
sex: false,
sayHi: function() {
console.log('我在');
}
}
for (var i in robot) {
console.log(i);
console.log(robot[i]);
}
//object.keys();方法会返回一个由一个给指定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致
var keysValue = Object.keys(obj1);
for (var i=0;i<obj1.length;i++){
console.log(keysValue[i];
console.log(obj1.[keysValue[i]]);
}
4.静态成员和实例化成员的区别
function Person(uname,age){
this.uname = uname;
this.age = age;
this.sayHi = function(){
console.log('永远少年')
}};
//实例化成员:对象的相关方法,对象是一个实例
var p1 = new Person('浮生',18);
console.log(p1.age);//18
p1.sayHi();//永远少年
//静态成员:构造函数的属性和方法
Person.gender = '女';
Person.studying = function(){
console.log('study hard and make progress every day');
}
console.log(Person.gender);//女
Person.studying();//study hard and make progress every day
5.检测属性是否存在
var robot = {
fname: '小爱同学',
age: 5,
sex: false,
sayHi: function() {
console.log('我在');
}
}
//判定属性是否存在(存在弊端不准确)当age的值为0时返回值为不存在;
if(robot.age){
console.log('存在');
}else{
console.log('不存在');
}
//使用in方法可以准确的检测,返回值时布尔值
console.log('age' in robot);//true
6.属性的特征
6.1数据属性
数据属性用来存储一个值,在该位置可以对该位置的数据值进行读取。
6.2访问器属性
访问器属性不包含值,而定义一个包含get和set函数,当读取属性时,调用get函数,当写属性时,调用set 函数
var obj1 = {
//数据属性
uname:'张三',
age:18,
//访问器属性
set gender(sex){
this.sexx = sex,
},
set gender(sex){
this.sexx = sex;
},
get gender{
return this.sexx;
}
}
7.定义属性
7.1 定义属性:可枚举,可配置,可修改 默认值是false;
可以用Object.defineProperty(obj, prop, descriptor):可以添加新属性,也可以修改属性;
拥有被修改属性的对象、被修改的属性名、包含描述特征的对象。
var obj1 = {
name: 'nihao',
age: 18,
sayHi: function() {
console.log('Hello 人生');
}
}
object.defineProperty(obj1, 'hobby', {
value: 'listening',
// 可枚举
enumberable: 'true',
// 不可配置
configurable: 'false',
//不可修改
writable: 'false'
//Object.getOwnPropertyDecriptor()方法返回一个有自身属性对应的属性描述符.
console.log(Object.getOwnPropertyDescriptor(obj1, 'hobby')); //{value: "listening", writable: true, enumerable: false, configurable: true}
})
7.2 定义多个属性
定义多个属性使用的是Object.defineProperties(obj, prop)
,这个方法接受2个参数,第一个是属性所属的对象,第二个是包含被定义属性的对象。
var obj1 = {
name: 'nihao',
age: 18,
sayHi: function() {
console.log('Hello 人生');
}
}
// 定义属性:可枚举,可配置,可修改 默认值是false;
// 可以用Object.defineProperties(obj, prop):可以添加新属性,也可以修改属性;
// 拥有被修改属性的对象、包含描述特征的对象。
Object.defineProperties(obj1, {
hobby: {
value: 'listening',
// 可枚举
enumberable: 'true',
// 不可配置
configurable: 'false',
//不可修改
writable: 'false'
},
gender: {
value: '男',
configurable: 'true',
enumberable: 'true',
writable: 'true'
},
uname: {
configureable: 'true',
enumberable: 'flase',
writeable: 'flase',
get: function() {
return this.name;
},
set: function() {
this.name = uname;
}
}
});
//Object.getOwnPropertyDescriptors()方法来获取多个对象自身属性的描述
console.log(Object.getOwnPropertyDescriptors(obj1));
//{name: {…}, age: {…}, sayHi: {…}, hobby: {…}, gender: {…}, …}
//展开如下:
//name: {value: "nihao", writable: true, enumerable: true, configurable: true}
//age: {value: 18, writable: true, enumerable: true, configurable: true}
//sayHi: {writable: true, enumerable: true, configurable: true, value: ƒ}
//hobby: {value: "listening", writable: true, enumerable: false, configurable: true}
//gender: {value: "男", writable: true, enumerable: false, configurable: true}
//uname: {enumerable: false, configurable: false, get: ƒ, set: ƒ}
8 禁止扩展
方法:Object.preventExtensions(obj);
判断对象是否可扩展:Object.isExtensible(obj);
var obj1 = {
name:'叶伏天',
age:18
};
console.log(Object.isExtensible(obj1);//true
Object.preventExtensions(obj1);
console.log(Object.isExtensible(obj1);//false
9.封印对象
方法:Object.seal(obj);
判断对象是否被封印:Object.issealed(obj);
var obj1= {
name:'叶伏天',
age:18,
profession:'天生帝王'
};
// 判断是否被封印
console.log(Object.isSealed(obj1)); //false
// 设置对象封印
Object.seal(obj1);
// 判断是否被封印
console.log(Object.isSealed(obj1)); //true
10.冻结对象
方法:Object.freeze(obj);
判断对象是否被冻结:Object.isFrozen(obj);
var obj1= {
name:'叶伏天',
age:18,
profession:'天生帝王',
hobby:'大道遗神曲'
};
// 判断是否被冻结
console.log(Object.isFrozen(obj1));//flase
// 冻结对象
Object.freeze(obj1);
// 判断是否被冻结
console.log(Object.isFrozen(obj1));//true