文章目录
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;
}
}