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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,139评论 0 6
  • title: js面向对象date: 2017年8月17日 18:58:05updated: 2017年8月27日...
    lu900618阅读 581评论 0 2
  • 先前整理过js作用域和this关键字的用法,以及分析过js面向对象各种方式,这些都是实现js面向对象所必须的。忘记...
    会飞的贼er阅读 643评论 0 6
  • 风将门吹开 我昂起头 感到一片冰凉的唇(吻) 挥着泪水的云 默默地 默默地 从门缝中挤过去 留下 啵的一声 彩虹般...
    韩森Gill阅读 394评论 1 3
  • 已经不知道是清醒还是疲倦了,喝着红牛不会睡觉但效率堪忧。 已经和施娘娘徐摊牌了,得考上不然伤自尊hhh
    Miss_all_sunday阅读 195评论 0 0