js面向对象
1.概念
面向对象不是一种语法,是一种编程的思想。
二 创建对象
直接创建:能直接看到变量的类型和和值
var obj = {}
构造函数:
var obj = new Object();
空对象不要紧,知道怎么往对象中添加属性就行。
如果要定义多个人的信息,需要这样创建多次。
三 工厂函数
创建对象都是在重复动作定义一个函数,每次调用都能得到一个对象
var obj1 = new Object();
obj1.name = "张三";
obj1.age = 12;
obj1.sex = '男';
var obj2 = new Object();
obj2.name = '李四';
obj2.age = 13;
obj2.sex = '女';
var obj3 = new Object();
obj3.name = '王五';
obj3.age = 11;
boj3.sex = '女';
这种重复定义一个函数,可以用创建工厂函数,以后用的时候直接调用
创建工厂函数:
function createObj(name,age,sex){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sex = sex;
return obj;
}
var obj1 = createObj("张三",12,"男");
var obj2 = createObj("李四",13,"女");
var obj3 = createObj("王五",11,"女");
工厂函数优缺点:
优点:可以同时创建多个对象
缺点:创建出来的没有具体的类型(比如是Array和MouseEvent),都是object类型的,但我们看到自己的对象只是object,不知道具体是什么类型。
解决方案:自定义构造函数。其实相当于自己写一个函数,专门用来new对象。
四 自定义构造函数
步骤:
-
-
this指向了这个新对象(新对象就有了属性,创建了属性)
-
执行构造函数,也就是调用了这个函数(给对象添加属性和方法,给属性和方法赋值)
-
function Person(name,age,sex){ this.name = name; this.age = age; this.sex = sex; } var obj1 = new Person("张三",12,"男"); var obj1 = new Person("李四",13,"女"); var obj1 = new Person("王五",11,"女");
-
面向对象步骤:
-
定义一个空的函数;
- new一个新的函数;
- 获取所需元素的属性;
- 绑定事件类型
- 调用函数
构造函数的作用:
给对象添加属性和方法。
构造函数注意事项:
1.构造函数天生就是用来创建对象的,所以必须和new配合使用,否则就不具备创建对象的能力
2.构造函数内部不能有return关键字,因为构造函数会自动返回对象。如果返回基本数据类型,和不加效果一样,如果返回复杂数据类型,构造函数就没意义了。
3.如果new的时候,不需要参数,那么下括号可以省略
缺点
不同的对象应该由相同的方法,但是方法在内存中占用了多个空间-浪费
使用原型可以完美解决这个问题。
5.原型
原型对象:在声明了一个函数之后,浏览器会自动按照一定的规则创建一个对象,通过函数的prototype可以访问到这个对象,这个对象就叫做原型对象。
在声明了一个函数后,这个构造函数(声明了的函数)中会有一个属性prototype,这个属性指向的就是这个构造函数(声明了的函数)对应的原型对象;原型对象中有一个属性constructor,这个属性指向的是这个构造函数(声明了的函数)
var obj = {
// name:"张三",
// age:12
// }
// console.log(obj);
.任何一个对象,天生自带一个属性:__proto__ , 这个东西是一个对象,原型/原型对象;
console.log(obj.__proto__); obj.__proto__.sex = '美女'; console.log(obj.__proto__);
function Person(){
}
var p = new Person();
Object.prototype.name = '李四';
Object.prototype.eat = function(){
// console.log("吃");
}
console.log(p); // 最小的对象
console.log(p.__proto__);
console.log(p.__proto__.__proto__);
console.log(p.__proto__.__proto__.constructor);
console.log(p.__proto__.__proto__.__proto__);
浙公网安备 33010602011771号