面向对象

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值