// 对象的增删改查
// 定义一个对象
var obj = {
name: 'zhangsan',
age: 18
};
// 增
obj.sex = 'male';
// 改
obj.age = 20;
// 查
console.log(obj.name);
// 删
delete obj.age;
对象创建方法
// 1. 对象字面量/对象直接量
var obj = {} // plainObject
// 2.构造函数
// 1) 系统自带的构造函数 Object()
var obj2 = new Object(); // 每执行一次就生产一个对象,每次生产的对象都一样,但相互独立
obj2.name = 'xiaozhang';
obj2.fn = function(){};
// 2) 自定义构造函数
// 构造函数结构上和函数没有任何分别,构造一个对象需要用new 操作符。
// 为了区别构造函数和函数有区别,人为的定义了一个代码规范 用大驼峰式命名规则
function Person() {
}
var person1 = new Person();
构造函数内部原理
- 在函数体最前面隐式加上this = {}
- 执行this.xxx = xxx;
- 隐式返回this
function Student(name, age, sex) {
// var this = {};
this.name = name;
this.age = age;
this.sex = sex;
this.say = function (){
console.log(this.name);
}
// return this;
}
console.log(new Student('xiaoming',18,'male').name)
如果用构造函数,要更改返回值 必须为对象(数组,function,{}),其他返回值无效(number,Boolean。。)
var Person(name, height) {
this.name = name;
this.height = height;
return {};
}
var person1 = new Person('xiaowang',180);
console.log(person1); // object {}
var Person2(name, height) {
this.name = name;
this.height = height;
return 123; // 无效 依然返回this
}
var person2 = new Person2('xiaowang',180);
console.log(person1); // person2 {name: 'xiaowang', height: 180}
包装类
var num = new Number(123);
var str = new String('abcd');
var bol = new Boolean('true');
// undefined null 不能有属性
// 原始值不能有属性方法 使用属性方法会进行一个包装类
var str = 'abc';
console.log(str.length); // 3
var num = 3;
num.len = 1;
// new Number(3).len = 1; delete
// 隐式进行包装类操作,然后删除
var str2 = 'abcd';
str.length = 2;
console.log(str); // 'abcd'
// str2 是原始值 不能有属性方法
// new String('abcd').length = 2 然后系统再 delete 不影响原来的值
- 练习题1
var str = 'abc';
str += 1; // 'abc1'
var test = typeof str; // 'String'
if(test.length == 6) { // true
test.sign = 'typeof的结果可能为String'; // 原始值赋值后会自动销毁
}
console.log(test.sign); // undefined
// 访问原始值的属性,会自动 new String() 调用包装类 然后再里面的值
- 练习题2
var Person (name, age, sex) {
var a = 0;
this.name = name;
this.age = age;
this.sex = sex;
function sss() {
a++;
console.log(a);
}
this.say = sss;
}
var person1 = new Person();
person1.say(); // 1
person1.say(); // 2
var person2 = new Person();
person2.say(); // 1
// 每次new 都是一个新的执行期上下文 互不影响