面向对象
(1)、JavaScript对每个创建的对象都会自动设置一个原型(谷歌火狐中是proto),指向它的原型对象prototype;
function person() {}
//那么person的原型链就是:
person(proto) > Function.prototype(proto) > Object.prototype
//所以最终的结果都是指向原型对象,就称为面向对象
面向对象的方法
1、工厂模式—本质就是在函数中创建一个对象,每次调用时候传入不同的参数,然后返回这个对象
//工厂模式
function show(name, age) {
//创建对象
var obj = new Object();
obj.name = name;
obj.age = age;
obj.say = function () {
console.log(this.name + "在说话。。。");
}
return obj;//返回这个对象
}
var stu = show("万物", 23);
stu.say();
// 工厂模式
function Person(name, age) {
var p = {};//创建一个对象
p.name = name;
p.age = age;
p.say = function () {
console.log("hello " + this.name);
}
return p;//返回这个对象
}
var p1 = Person('王五', 24);
console.log(p1);//{name:"王五",age:"24",say:f}
console.log(p1.say());//hello 王五
var p2 = Person('XX', 25);
console.log(p2);//{name:"XX",age:"25",say:f}
console.log(p2.say());//hello XX
2、构造函数模式—跟工厂模式的区别就是函数中用this指代对象也不用return了,还有一个区别就是创建对象的时候是new一个对象
// 构造函数模式
function Pers(name, age, addr) {
this.name = name;
this.age = age;
this.addr = addr;
this.walk = function () {
console.log(this.name + "在走路。。。。")
}
}
var str1 = new Pers("jack", 23, "开封");
str1.walk();
// 构造函数模式
function Person(name, age) {
this.name = name;
this.age = age;
this.say = function () {
console.log("hello " + this.name);
}
}
var p1 = new Person('王五', 24);
console.log(p1);//Person {name:"王五",age:"24",say:f}
console.log(p1.say());//hello 王五
var p2 = new Person('XX', 25);
console.log(p2);//Person {name:"XX",age:"25",say:f}
console.log(p2.say());//hello XX
3、原型方法,就是通过创建一个Function然后在function.prototype上添加属性和方法,再new一个Function这种方式创建一个对象。
//原型模式
var stu = new Object();//创建没对象
stu.name = "jack";
stu.age = 23;
stu.say = function () {
console.log(this.name + "在说话。。。。。");
}
stu.walk = function () {
console.log(this.name + "在走路。。。。。");
}
stu.say();
stu.walk();
4、混合模式(原型加构造函数的模式)— 就是把实例的属性写在构造函数里面,每个实例共享的属性和方法写在原型里面。那么什么是实例的属性呢?就是通过new一个函数都会有的属性就是实例的属性,它们互不影响各自独立。那么什么是共享的属性和方法呢?就是prototype里面如果有sing这个方法,那么new两个实例后都会有sing这个实例的方法。那么问题来了new两个实例之后构造函数里面的属性不是也是都会有的吗?所以区别就是prototype里面的属性和方法是不独立的,不管new多少个实例,prototype始终指向的地址都是同一个,也就有了面向对象的省内存,不浪费资源的优点。好直接上代码
//构造函数里面写上实例的属性和方法
function Person(name, age, addr) {
this.name = name;
this.age = age;
this.adtdr = addr;
}
//原型上写共享的属性和方法
Person.prototype.walk = function () {
console.log(this.name + "在走路。。。。。。");
}
var stu = new Person("王五", 23, "郑州");
stu.walk();
//构造函数里面写上实例的属性和方法
function Person(name, age) {
this.name = name;
this.age = age;
this.say = function () {
console.log("hello " + this.name);
}
}
//原型上写共享的属性和方法
Person.prototype.sing = function () {
console.log("Hi " + this.name);
}
//或者这么写
/*Person.prototype={
constructor:Person,
sing:function() {
console.log("Hi "+this.name);
}
}*/
var p1 = new Person('王五', 24);
console.log(p1);//Person {name:"王五",age:"24",say:f}
console.log(p1.say());//hello 王五
console.log(p1.sing());//Hi 王五
5、josn
的用法
(1)、Json
组成
Var json = {“aaa”: 1,“bbb”: 2,“ccc”: 3,“ddd”: 4}
Json由{}和key:value以及逗号组成,三部分。(只有一个键值对key:value时,可以没有逗号)
(2)、json
是一种与语言无关的数据交换的格式,作用:
1.使用ajax
进行前后台数据交换
2.移动端与服务端的数据交换
(3)、Json
的格式与解析
json
有两种格式:
1)对象格式:{“key1”:value,“key2”:value,“key3”:value…}
2)数组/集合格式:[obj,obj,obj…]
例如:user对象 用json数据格式表示(user对象里面有4个属性)
{“username”:“zhangsan”,“age”:28,“password”:“123”,“addr”:“北京”}
List 用json数据格式表示(集合里面有3个paoduct对象)
[{“pid”:“10”,“pname”:“小米4C”},{},{}]
注意:对象格式和数组格式可以互相嵌套
json的key是字符串 json的value是Object(json的值可以为函数)
json的解析:
json是js的原生内容,也就意味着js可以直接取出json对象中的数据
var person = {"firstname":"张","lastname":"三丰","age":100};
//取出lastname
alert(person.lastname);
//取出age
alert(person.age);