面向对象(二)

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

1、理论基础


2、原型对象

1、创建

无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。
即:每创建一个函数, 就会同时创建它的prototype对象, 这个对象也会自动获取constructor属性;

2、constructor属性

默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指针,指向prototype属性所在函数。
对原型对象自身来说, 只有一个constructor属性, 而其他属性可以由我们添加或者从Object中继承.

3、创建实例

当调用构造函数创建一个新实例后,该实例的内部将包含一个内部属性proto,该属性的指针, 指向构造函数的原型对象。即:每个实例中, 会有一个属性, 该属性是指向原型对象的.

写到此我们会发现构造函数和实例通过prototype指针指向原型对象,原型对象通过constructor属性指针指向构造函数,可以理解它们互为映射,只有它们互相关联才能保证可以为原型对象添加自定义属性,同时实例对象能够共享原型对象的属性与方法。


3、对象搜索属性的过程


4、原型对象的缺陷

// 定义Person构造函数
function Person() {}

// 设置Person原型
Person.prototype = {
    constructor: Person,
    name: "Tom",
    hobby: ["Basketball", "Football"],
    sayHello: function () {
        console.log("Hello JavaScript")
    }
}

// 创建两个person对象
var person1 = new Person()
var person2 = new Person()

console.log(person1.hobby) 
<!--Basketball,Football-->
console.log(person2.hobby) 
<!--Basketball,Football-->

person1.hobby.push("tennis")

console.log(person1.hobby)
// Basketball,Football,tennis
console.log(person2.hobby) 
// Basketball,Football,tennis

为了解决上面的问题可以采用构造函数模式与原型模式的组合:共享属性与方法都写在原型上,实例对象的私有属性都写在构造函数中

function Person(name, age, height) {
  this.name = name
  this.age = age
  this.height = height
  this.hobby = ["Basketball", "Football"]
}

Person.prototype = {
  constructor: Person,
  sayHello: function () {
    console.log("Hello JavaScript")
  }
}

var person1 = new Person("Coderwhy", 18, 1.88)
var person2 = new Person("Kobe", 30, 1.98)
console.log(person1.sayHello == person2.sayHello) // true

person1.hobby.push("tennis")
console.log(person1.hobby)
// [ 'Basketball', 'Football', 'tennis' ]
console.log(person2.hobby)
// [ 'Basketball', 'Football' ]

上一篇 下一篇

猜你喜欢

热点阅读