JavaScript中的对象和OC中的字典 Dictionary是一样的,一组“键值对”(key-value)的集合,并且是一种无序的复合数据集合。
- 注意:JavaScript不是面向对象的语言,但是可以模拟面向对象的思想, 它是一门基于对象的语言。
对象的创建
1.调用系统的构造函数创建对象
* var 变量名= new Object(); Object 是系统的构造函数 Array
*
* 2.自定义构造函数创建对象(结合第一种和需求通过工厂模式创建对象)
*
*
* 3.字面量的方式创建对象
*
*
字面量的方式创建对象
- JavaScript用一个{...}表示一个对象,键值对以xxx: xxx形式申明,用
,
隔开。注意,最后一个键值对不需要在末尾加,
,如果加了,有的浏览器(如低版本的IE)将报错。
var object1 = {
name:"cc",
age:"18",
schrool:"第一高级中学",
height:"1.70",
weight:"150"
}
console.log(object1);
//打印结果:Object { name: "cc", age: "18", schrool: "第一高级中学", height: "1.70", weight: "150" }
调用系统的构造函数
创建对象
- 调用系统的
构造函数
创建对象
var obj = new Object();
//属性
obj.name = "CC";
obj.age = "18;"
//方法
obj.paly = function () {
console.log("玩什么");
}
console.log(obj.name);
console.log(obj.paly());
自定义构造函数创建对象
- 工厂模式创建对象
//工厂模式创建对象
function creatObject(name,age) {
var obj = new Object();
obj.name = name;
obj.age =age;
obj.fn = function () {
console.log("IT程序员");
};
return obj;
}
var obj1 = creatObject("CC","18",);
console.log(obj1.name);
console.log(obj1.age);
obj1.fn();
- 自定义构造函数创建对象
//定义构造函数 注意首字母大写
function Person (name,age) {
this.name = name;
this.age = age;
this.sayHi = function () {
console.log("你好,我是:"+this.name,"今年:"+this.age);
};
}
var per = new Person("cc","18");
console.log(per.name);
console.log(per.age);
per.sayHi();
- 关于 key,如果key为数字,或者包含空格或运算符则要加上引号,在取值的时候要用 ["key名"]来访问
var object1 = {name:"cc",
age:"18",
schrool:"第一高级中学",
height:"1.70",
"weight-haha":"150"
}
console.log(object1.height);
console.log(object1["weight-haha"]);
//打印结果:1.70 150
- 对象的 每一个key我们成为
属性
(property),属性可以动态创建,不必在对象中声明
,它对应的value可以是任意数据类型,如果key对应的是一个函数,那么我们成这个函数为这个对象的方法。
var obj = {
p: function (x) {
return 2 * x;
}
};
obj.p(1) // 2
对象的引用
- 如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量
var o1 = {name:"cc",
age:"18"};
var o2 = o1;
o2.b = "hah";
console.log(o1);
//打印:
Object { name: "cc", age: "18", b: "hah" }
上面代码中,o1和o2指向同一个对象,因此为其中任何一个变量添加属性,另一个变量都可以读写该属性。此时,如果取消某一个变量对于原对象的引用,不会影响到另一个变量
var o1 = {};
var o2 = o1;
o1 = 1;
o2 // {}
上面代码中,o1和o2指向同一个对象,然后o1的值变为1,
这时不会对o2产生影响,o2还是指向原来的那个对象。
- 对象是在 堆中存储,而他的是值 是有 栈和堆决定的
- 例子
function Person (name,age) {
this.name = name;
this.age = age;
this.salary = salary;
}
function fun (person) {
//person的指针是0x120
person.name = "CC";
// 创建新的对象,原来的指向0x120 取消 重新指向0x110
person = new Person("XX",18,1000);
}
//创建对象0x120
var p = new Person("zs",18,1000);
console.log(p.name);
//指针传递
fun(p);
console.log(p.name);
//打印的结果: zs, XX
案例图片.jpg
属性
- 对象可以动态的添加属性
- 可以直接赋值属性
var obj = {};
obj.foo = 'Hello';
obj['bar'] = 'World';
//打印
Object { foo: "Hello", bar: "World" }
-
Object.keys
是查看所有的属性
var obj = {
key1: 1,
key2: 2
};
Object.keys(obj);
// ['key1', 'key2']
-
delete
删除属性
var obj = { p: 1 };
Object.keys(obj) // ["p"]
delete obj.p // true
obj.p // undefined
Object.keys(obj) // []
-
in
运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true
,否则返回false
。
-in
运算符的一个问题是,它不能识别哪些属性是对象自身的,哪些属性是继承的
var obj = { p: 1 };
'p' in obj // true
-
for…in 循环
遍历属性
var object1 = {name:"cc",
age:"18",
schrool:"第一高级中学",
height:"1.70",
"weight-haha":"150"
}
for (var i in object1){
console.log(i);
}
//打印:
name
age
schrool
height
weight-haha
new运算符
-
new 关键字 去声明新的对象
-
new运算符的作用是创建一个对象实例。这个对象可以是用户自定义的,也可以是带构造函数的一些系统自带的对象。
- 所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。
-
new 关键字可以让 this 指向新的对象
// this指向的是函数的调用者 或者是事件的调用者
function person() {
this.x = 10;
}
var obj2 = new person();
console.log(obj2.x);
prototype 原型 (就是给类扩充方法或者属性,创建的实例对象都可以使用)
- 作用:共享数据,节省内存空间
- 类.prototype.方法 = function() {} 具体格式
Array.prototype.run = function () {
console.log("开奔驰");
}
var arr = [];
arr.run();
var arr1 = [];
arr1.run();
构造原型实例之前的关系.jpg
- 构造函数创建实例对象
2.构造函数有prototype 原型属性指向原型对象
3.实例对象有proto原型属性 可以间接指向原型对象
网友评论