文章目录
- 对象(Objects)
- 构造函数(Constructor functions)
- 原型(Prototypes)
- 原型链(Prototype chain)
- 类(Classes)
- 继承(Inheritance)
JavaScript(JS)是一种支持面向对象编程(OOP)的语言,尽管它不是传统的基于类的面向对象语言,而是基于原型(prototype-based)的面向对象语言。在JavaScript中,对象可以被视为一组属性(property)和方法(method)的集合,这些属性和方法构成了对象的状态和行为。
对象(Objects)
在JavaScript中,几乎一切都是对象,包括内置对象(如Array, Date, Function等)和用户自定义对象。
创建对象可以通过字面量方式
var person = {name: 'John Doe',age: 30,sayHello: function() {console.log('Hello, my name is ' + this.name);}
};
构造函数(Constructor functions)
1、构造函数用于创建特定类型的对象实例
function Person(name, age) {this.name = name;this.age = age;this.sayHello = function() {console.log('Hello, my name is ' + this.name);};
}
var john = new Person('John Doe', 30);
原型(Prototypes)
1、每个函数都有一个.prototype
属性,用于关联一组方法和属性,这些方法和属性可以被该函数创建的对象实例共享
2、默认情况下,通过构造函数创建的对象实例会有一个隐式原型指针 [[Prototype]](可通过 __proto__
或 Object.getPrototypeOf()
查看),指向其构造函数的 .prototype
function Person(name, age) {this.name = name;this.age = age;this.sayHello = function() {console.log('Hello, my name is ' + this.name);};
}
var john = new Person('John Doe', 30);
原型链(Prototype chain)
1、当试图访问对象的属性或方法时,如果对象本身没有该属性,JavaScript会沿着原型链向上查找
function Person() {}
Person.prototype.sayAge = function() {console.log('My age is ' + this.age);
};var john = new Person();
john.age = 30;
john.sayAge(); // My age is 30
类(Classes)
1、ES6引入了基于类的面向对象编程(Class syntax),这是一个语法糖,实际上底层还是基于原型的机制
class Person {constructor(name, age) {this.name = name;this.age = age;}sayHello() {console.log('Hello, my name is ' + this.name);}
}
const jane = new Person('Jane Doe', 28);
继承(Inheritance)
1、JavaScript支持通过原型链实现继承,也可以通过ES6类的 extends 关键字实现类继承
// 原型链继承
function Person(name, age) {...}
function Employee(name, age, jobTitle) {Person.call(this, name, age);this.jobTitle = jobTitle;
}
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;// ES6类继承
class Person {...}
class Employee extends Person {constructor(name, age, jobTitle) {super(name, age);this.jobTitle = jobTitle;}
}