对象
对象的基本知识
- 万事万物皆对象
- 属性的增删改查
var xiaoming={
name:'xiaoming',
age : 18,
sayName:function(){
console.log(this.name);
}
}
xiaoming.sayName();// xiaoming 访问属性
xiaoming.wife='xiaozhang';// 增加属性
console.log(xiaoming.wife);// xiaozhang
delete xiaoming.age;// 删除属性
console.log(xiaoming.age);// undefined
xiaoming.wife = 'xiaoli';// 修改属性
console.log(xiaoming.wife);// xiaoli
对象的创建方法
1. var obj = { } planObject 对象字面量/对象直接量
2. 构造函数创建方法:
- 系统自带的构造函数new Object()、new Array()、new String()等等
注意:var obj = new Object();和var obj = { };没有区别 - 自定义构造函数(遵循大驼峰式命名规则)
function Person(){
}
var people = new Person();// 创建对象
- 构造函数的内部原理
- 在函数体前面隐式的加上this = {};
- 执行this.xxx = xxx ;
- 隐式返回this
function People(name, age) {
//var this = {};
this.name = name;
this.age = age;
//return this;
}
var people=new People('xiaoming',18);
console.log(people);// People {name: "xiaoming", age: 18}
但是如果要显式的返回一个值的话,返回引用类型会覆盖,返回原始值则不会
function People(name, age) {
this.name = name;
this.age = age;
return new Object();
}
var people=new People('xiaoming',18);
console.log(people);// {}
function People(name, age) {
this.name = name;
this.age = age;
return 123;
}
var people=new People('xiaoming',18);
console.log(people);// People {name: "xiaoming", age: 18}
3. Object.create(原型)方法
包装类
原始值没有属性和方法,但是如果强行添加属性或者访问属性的话,系统就会新建一个包装类,然后在包装类上进行操作,操作完成后进行销毁。
var num = 3;
// 原始值没有length属性,系统就新建一个Number()对象来添加length属性,但是操作完成后系统会自动删除该对象
// 相当于 var obj = new Number(3);obj.length = 4;delete obj;
num.length=4;
// 再次访问相当于再次新建一个Number对象,注意上面创建的对象已经被销毁
// new Number(3).length;
console.log(num.length);// undefined
var str = 'abcd';
//相当于 var obj = new String('abcd');
// obj.length = 2;
// delete obj;
str.length = 2;
// 相当于 var obj = new String('abcd');
// console.log(obj.length);
// delete obj;
console.log(str.length);// 4
例题:
var str = 'abc';
str+=1; //str = 'abc1';
var test = typeof str;//test = 'string';
if(test.length == 6){
// var obj = new String(;'abcd1');
// obj.sing = true;
// delete obj;
test.sign= true;
}
// var obj = new String(;'abcd1');
// console.log(obj.sing);
// delete obj;
console.log(test.sign);// undefined
function Person(name,age,sex){
var a = 0;
this.name = name;
this.age = age;
this.sex = sex;
function test(){
a++;
console.log(a);
}
this.say = test;
}
var p1=new Person();
p1.say();// 1
p1.say();// 2
var p2=new Person();
p2.say();// 1
// 主要考察闭包,在每次调用构造函数的时候,都会重新生成AO对象,
// 所以每次都会创建一个新的a