下面是“JS面向对象的程序设计相关知识小结”的详细讲解。
1. Javascript面向对象基础
1.1 对象
在Javascript中,对象是由属性和方法组成的实例。属性可以是一个值、一个函数或一个对象。一个对象的属性也可以是另一个对象。方法是指对象可以执行的函数。
对象的创建可以使用字面量语法、构造函数或Object.create()方法。例如:
// 方式1:字面量语法
var myObject = {
property1: "value1",
property2: function() {
console.log("I am a method");
}
};
// 方式2:构造函数
function MyClass(value) {
this.property = value;
}
var myClassInstance = new MyClass("someValue");
// 方式3:Object.create()方法
var parentObject = {
parentProperty: "parentValue"
};
var childObject = Object.create(parentObject);
childObject.childProperty = "childValue";
1.2 构造函数和原型
构造函数是用来创建对象的函数,通过new关键字调用构造函数返回一个新的对象实例。原型是一个对象,它可以作为其他对象的模板,使得这些对象可以共享原型对象中的属性和方法。
在Javascript中,每个函数都有一个隐式的原型属性(prototype),当该函数被用作构造函数时,它创建的实例对象会从该函数的隐式原型属性中继承属性和方法。
例如:
function MyClass(value) {
this.property = value;
}
MyClass.prototype.method = function() {
console.log("I am a method");
}
var myClassInstance = new MyClass("someValue");
以上代码中,MyClass.prototype.method是在原型中定义的方法,创建的实例对象myClassInstance可以使用该方法。
1.3 原型链
每个Javascript对象都有一个隐式的原型对象(proto),它是从创建该对象的构造函数的prototype属性继承而来的。如果该原型对象也有自己的原型对象,则这些对象形成一条链式结构,称为原型链。
例如:
function Animal() {}
Animal.prototype.eat = function() {
console.log("I am eating");
}
function Dog() {}
// 继承Animal的属性和方法
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.bark = function() {
console.log("Woof woof!");
}
var myDog = new Dog();
myDog.eat(); // "I am eating"
myDog.bark(); // "Woof woof!"
以上代码中,Dog继承了Animal的原型对象,并在自己的原型对象中定义了一个新的方法。
2. 面向对象进阶
2.1 继承
继承是指子类对象可以共享父类对象的属性和方法,使得子类对象具有父类对象的特征。
Javascript中实现继承的方式有:
- 原型链继承
- 构造函数继承
- 组合继承
- 寄生组合继承
其中,寄生组合继承是最常见的方式,它同时使用了原型链和构造函数的方式实现继承。
例如:
function Animal(name) {
this.name = name;
}
Animal.prototype.eat = function() {
console.log(this.name + " is eating.");
}
function Cat(name) {
// 构造函数继承
Animal.call(this, name);
}
// 原型链继承
Cat.prototype = Object.create(Animal.prototype);
// 寄生组合继承
Cat.prototype.constructor = Cat;
Cat.prototype.meow = function() {
console.log(this.name + " is meowing.");
}
var myCat = new Cat("Kitty");
myCat.meow(); // "Kitty is meowing."
myCat.eat(); // "Kitty is eating."
以上代码中,Cat继承了Animal的属性和方法,同时又在自己的原型对象中定义了一个新的方法。
2.2 多态
多态是指同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在Javascript中,多态可以通过调用不同对象的同名方法来实现。
例如:
function Animal() {}
Animal.prototype.eat = function() {
console.log("I am eating");
}
function Dog() {}
Dog.prototype.eat = function() {
console.log("I am a dog and I am eating");
}
function Cat() {}
Cat.prototype.eat = function() {
console.log("I am a cat and I am eating");
}
var myAnimal = new Animal();
var myDog = new Dog();
var myCat = new Cat();
myAnimal.eat(); // "I am eating"
myDog.eat(); // "I am a dog and I am eating"
myCat.eat(); // "I am a cat and I am eating"
以上代码中,Animal、Dog和Cat都有一个名为eat的方法,但是它们的实现不同,可以产生不同的结果。
3. 示例说明
3.1 示例1:用户类和管理员类
下面是一个用户类和管理员类的示例,它们分别继承于一个公共父类,实现了多态。
/**
* 用户类
*/
function User() {
this.type = "user";
}
User.prototype.sayHi = function() {
console.log("Hi, I am a " + this.type);
}
/**
* 管理员类
*/
function Admin() {
this.type = "admin";
}
Admin.prototype.sayHi = function() {
console.log("Hi, I am an " + this.type);
}
// 创建实例对象
var user1 = new User();
var user2 = new User();
var admin1 = new Admin();
var admin2 = new Admin();
// 调用同名方法产生不同的结果
user1.sayHi(); // "Hi, I am a user"
user2.sayHi(); // "Hi, I am a user"
admin1.sayHi(); // "Hi, I am an admin"
admin2.sayHi(); // "Hi, I am an admin"
以上代码中,User和Admin分别继承于一个公共父类,并实现了sayHi方法,可以产生不同的结果。
3.2 示例2:员工类和经理类
下面是一个员工类和经理类的示例,它们分别继承于一个公共父类,同时还实现了自己的属性和方法。
/**
* 员工类
*/
function Employee(name, age, salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
Employee.prototype.work = function() {
console.log(this.name + " is working");
}
/**
* 经理类
*/
function Manager(name, age, salary, department) {
// 调用父类的构造函数
Employee.call(this, name, age, salary);
this.department = department;
}
// 原型链继承和寄生组合继承
Manager.prototype = Object.create(Employee.prototype);
Manager.prototype.constructor = Manager;
Manager.prototype.manage = function() {
console.log(this.name + " is managing " + this.department);
}
// 创建实例对象
var employee1 = new Employee("Tom", 25, 3000);
var employee2 = new Employee("Jerry", 27, 3500);
var manager1 = new Manager("Andy", 35, 8000, "Sales department");
var manager2 = new Manager("Lily", 40, 10000, "Marketing department");
// 调用不同对象的同名方法
employee1.work(); // "Tom is working"
employee2.work(); // "Jerry is working"
manager1.work(); // "Andy is working"
manager2.work(); // "Lily is working"
manager1.manage(); // "Andy is managing Sales department"
manager2.manage(); // "Lily is managing Marketing department"
以上代码中,Employee和Manager继承于一个公共父类Employee,并实现了自己的方法和属性,实现了多态。同时,Manager类还调用了Employee的构造函数,实现了构造函数继承。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS面向对象的程序设计相关知识小结 - Python技术站