定义
面向对象程序设计(英语:Object Oriented Programming,缩写:OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。
注:定义来自维基百科
对象是单个事物的抽象。比如一本书,一个苹果,一只猫都可以是一个对象
对象也是一个容器,封装了属性和方法。比如一只猫的颜色,年龄等是它的属性,吃饭,叫是它的方法
面向对象语言的要求
- 封装 - 把相关的信息(无论数据或方法)存储在对象中的能力
- 聚集 - 把一个对象存储在另一个对象内的能力
- 继承 - 由另一个类(或多个类)得来类的属性和方法的能力
- 多态 - 编写能以多种方法运行的函数或方法的能力
创建对象的方法:
通过对象字面量来创建
var student = {
name: "cinthia",
age: 19,
gender: "female",
sayHello: function() {
console.log("hi,my name is " + this.name);
}
};
通过 new Object() 创建对象。
var student = new Object();
(student.name = "cinthia"),
(student.age = 19),
(student.gender = "female"),
(student.sayHello = function() {
console.log("hi,my name is " + this.name);
});
通过工厂函数来创建对象。
function createStudent(name, age, gender) {
var student = new Object();
student.name = name;
student.age = age;
student.gender = gender;
student.sayHello = function() {
console.log("hi,my name is " + this.name);
};
return student;
}
var s1 = createStudent("cinthia", 19, "female");
var s2 = createStudent("lisa", 19, "female");
通过构造函数来创建对象。
function Student(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.sayHello = function() {
console.log("hi,my name is " + this.name);
};
}
var s1 = new Student("cinthia", 19, "female");
构造函数与工厂函数的区别
- 首先在构造函数内没有创建对象,而是使用 this 关键字,将属性和方法赋给了 this 对象。
- 构造函数内没有 return语句,this 属性默认下是构造函数的返回值。
- 函数名使用的是大写的 Student
- 用 new运算符和类名 Student 创建对象。
每次创建对象,存储在变量中的都是该对象的引用,而不是对象本身
原型
在 JavaScript 中,每一个函数都有一个 prototype属性指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。
<script type="text/javascript">
function F() {}
console.log(F.prototype); //Object,指向另一个对象
</script>
成员 | 描述 |
---|---|
Object.prototype.__ proto __ | 指向当对象被实例化的时候,用作原型的对象 |
Object . prototype . hasOwnProperty() | 返回一个布尔值,用来判断-一个属性是定义在对象本身而不是继承自原型链 |
Object . prototype . isPrototype0f() | 返回一个布尔值,示指定的对象是否在本对象的原型链中。 |
Object. prototype . toString() | 返回一个表示该对象的字符串 |
Object . prototype.value0f() | 返回指定对象的原始值 |
原型链
所有的对象都有原型,而原型也是对象,也就是说原型也有原型,如此下去,也就组成了原型链
属性搜索原则
- 首先从对象实例本身开始找,如果找到了这个属性或者方法,则返回。
- 如果对象实例本身没有找到,就从它的原型中去找,如果找到了,则返回。
- 如果对象实例的原型中也没找到,则从它的原型的原型中去找,如果找到了,则返回。
- 一直按着原型链查找下去,找到就返回,如果在原型链的末端还没有找到的话,那么如果查找的是属性则返回 undefined,如果查找的是方法则返回 xxx is not a function
原型链继承
利用原型让一个引用类型继承另外一个引用类型的属性和方法
function Student(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
Student.prototype.sayHi = function() {
console.log("hello");
};
var s1 = new Student("cinthia", 19, "female");
s1.sayHello(); // 打印 hello
var s2 = new Student("lisa", 19, "female");
s2.sayHello(); // 打印 hello
//s1、s2都继承了sayHello()的方法
面向对象编程是 JavaScript 编程的一种主流方式,这种方式可以提高代码的易读性,减少代码的冗余,降低代码设计的难度