js面向对象

面向对象思想主要是指实现封装、继承和多态

创建对象
1.工厂模式,传入必要的参数,返回一个特定的对象,缺点是每个对象都会生成一个实例方法

function createPerson(name, age, job) {
  var o = new Object()
  o.name = name
  o.age = age
  o.job = job
  o.sayName = function () {
    alert(this.name)
  }
  return o
}

2.构造函数模式

function Person(name, age, job) {
    this.name = name
    this.job = job
    this.age = age
    this.sayName = function () {
      alert(this.name)
    }
}
var person = new Person('jack', 24, 'job')

3.原型模式

image.png

理解原型对象:

创建函数的时候,会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。默认情况下,每个原型对象都会自动获得一个constructor属性,是一个指向prototype属性所在函数的指针。在创建对象实例后,实例内部会包含一个指针[[prototype]],指向构造函数的原型对象。实例与构造函数的连接 存在于实例与构造函数的原型对象之间,而不是实例与构造函数之间。

原型对象是一个默认包含constructor属性的对象,是函数的一个属性

每当代码读取对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例本身开始。如果在实例中找到了具有给定名字的属性,则返回该属性的值;如果没有找到,则继续搜索指针指向的原型对象。

new 操作符的作用
用来创建用户自定义的对象
当代码 new Person(...) 执行时,会发生以下事情:

1.一个继承自 Foo.prototype 的新对象被创建。
2.使用指定的参数调用构造函数 Foo ,并将 this 绑定到新创建的对象。new Foo 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用的情况。
3.由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)

继承
prototype与[[prototype]](Object.getPrototypeOf())的区别
prototype是函数的一个属性,为一个默认包含constructor属性的对象
[[prototype]]是对象的原型链属性,是一个私有变量,用于属性方法的继承Object.getPrototypeOf(obj) === Object.prototype

你可能感兴趣的:(js面向对象)