面向对象(三)

2020-09-08  本文已影响0人  懂会悟

1、构造函数、原型和实例的关系


2、原型链


// 1.创建Animal的构造函数
function Animal() {
    this.animalProperty = "Animal"
}
// 2.给Animal的原型中添加一个方法
Animal.prototype.animalFunction = function () {
  console.log(this.animalProperty)
}

// 3.创建Person的构造函数
function Person() {
    this.personProperty = "Person"
}

// 4.给Person的原型对象重新赋值
Person.prototype = new Animal()

// 5.给Person添加属于自己的方法
Person.prototype.personFunction = function () {
  console.log(this.personProperty)
}

// 6.创建Person的实例
var person = new Person()
person.animalFunction()
person.personFunction()

3、实例属性搜索

当以读取模式访问一个实例属性时,首先会在实例中搜索该属性。如果没有找到该属性,则会继续搜索实例的原型。在通过原型链实现继承的情况下,搜索过程就得以沿着原型链继续向上。
在找不到属性或方法的情况下,搜索过程总是要一环一环地前行到原型链末端才会停下来。

参照上面的例子


4、判断实例原型

// instanceof
console.log(person instanceof Object) 
// true
console.log(person instanceof Animal)
// true
console.log(person instanceof Person)
// true

// isPrototypeOf
console.log(Object.prototype.isPrototypeOf(person))
// true
console.log(Animal.prototype.isPrototypeOf(person))
// true
console.log(Person.prototype.isPrototypeOf(person))
// true

5、原型链模式的问题

function Person() {
  this.personProperty = "Person"
}

Person.prototype = new Animal()

Person.prototype.personFunction = function () {
  console.log(this.personProperty)
}

var person1 = new Person()
var person2 = new Person()

console.log(person1.colors) 
// red,green
console.log(person2.colors) 
// red,green
person1.colors.push("blue")
console.log(person1.colors) 
// red,green,blue
console.log(person2.colors) 
// red,green,blue

6、组合继承

基于原型链的问题我们可以使用组合继承来解决

// 1.创建构造函数的阶段
// 1.1.创建Animal的构造函数
function Animal(age) {
  this.age = age
  this.colors = ["red", "green"]
}

// 1.2.给Animal添加方法
Animal.prototype.animalFunction = function () {
  console.log("Hello Animal")
}

// 1.3.创建Person的构造函数
function Person(name, age) {
  Animal.call(this, age)
  this.name = name
}

// 1.4.给Person的原型对象重新赋值
Person.prototype = new Animal(0)

// 1.5.给Person添加方法
Person.prototype.personFunction = function () {
  console.log("Hello Person")
}

// 2.验证和使用的代码
// 2.1.创建Person对象
var person1 = new Person("Tom", 18)
var person2 = new Person("Jury", 30)

// 2.2.验证属性
console.log(person1.name + "-" + person1.age)
console.log(person2.name + "-" + person2.age)

// 2.3.验证方法的调用
person1.animalFunction() 
// Hello Animal
person1.personFunction() 
// Hello Person

// 2.4.验证引用属性的问题
person1.colors.push("blue")
console.log(person1.colors) 
// red,green,blue
console.log(person2.colors) 
// red,green

上一篇 下一篇

猜你喜欢

热点阅读