2018-11-22 面向对象3

JavaScript的面向对象是基于constructor(构造函数)与prototype(原型链)的。

1.构造函数:constructor

构造函数就是一个函数。和普通函数有一些区别:

  • 函数的内部使用this的关键字。
  • 首字母是大写的。
  • 使用的时候要用new操作符创建实例对象。
2.原型:prototype

原型是一个对象,称为原型对象。
构造函数创建实例对象,构造函数具有原型,实例对象也具有原型。实例对象的原型指向构造函数的原型。这就是原型链。

3.原型链:
4.proto:每一个实例对象都具有的私有属性。指向自己的原型。

proto属性(前后各两个下划线),用来读取或设置当前对象的prototype对象。目前,所有浏览器(包括 IE11)都部署了这个属性。
eg:1__protp___
效果如下:

2018-11-22 面向对象3_第1张图片
22.proto.jpg




    
    Document






constructor: 构造器。指向自己的构造函数。

5.new :

创建对象实例。
防止漏掉new造成错误:
在构造函数内部使用严格模式。
使用instanceof在内部判断。判断是否为当前对象的实例。
使用new.target 在内部判断,new.target指向自己的构造函数。
eg:2new
效果如下:


2018-11-22 面向对象3_第2张图片
22.new1.jpg
2018-11-22 面向对象3_第3张图片
22.new1.1.jpg



    
    Document






eg:3new
效果如下:


2018-11-22 面向对象3_第4张图片
22.new2.jpg



    
    Document






6.new的深入操作:

1.创建一个空对象,作为将要返回的对象实例。
2.将这个空对象的原型,指向构造函数的prototype属性。
3.将这个空对象赋值给函数内部的this关键字。
4.开始执行构造函数内部的代码。
5.将对象实例返回
eg:4new
效果如下:


2018-11-22 面向对象3_第5张图片
22.new3.jpg



    
    Document






7.构造函数里面的return语句:

如果return的是普通数据类型。那么相当于没写。
如果返回的是this,那么返回的与本身返回的是一样的。
如果返回的是一个其他对象。那么结果返回的就是这个对象。所以在构造函数内部返回对象要小心。

8.任何一个函数都可以使用new。返回值都是一个对象。

如果这个函数是一个构造函数的话,返回的是这个函数的实例。
如果函数是一个普通函数,那么返回的是一个空的对象。

9.Object对象,是所有JS对象的基础。

Object 的原型指向null。一切对象的基础是null,null也叫空。
eg: 5 Object
效果如下:


2018-11-22 面向对象3_第6张图片
22.5Object.jpg



    
    Document






9.(1)Object.create();

有的时候我们拿不到对象的构造函数。可以根据这个对象的某一个实例去创建一个对象。
eg:6create
效果如下:


2018-11-22 面向对象3_第7张图片
22.6create.jpg



    
    Document






对于对象来说,每一个属性 其实都有四个描述。
value 值
enumerable 枚举 遍历 for in
configurable 修改
writable 删除
后面三个默认值都是true。
eg:7create
效果如下:


2018-11-22 面向对象3_第8张图片
22.7create.jpg



    
    Document






eg:8.enumerable
效果如下:


2018-11-22 面向对象3_第9张图片
22.8enumerable.jpg



    
    Document






9.(2)Object.getPrototypeOf(obj)

获取obj对象实例的原型
eg:9Object.getPrototypeOf
效果如下:


2018-11-22 面向对象3_第10张图片
22.9getprototypeof.jpg



    
    Document






9.(3)Object.prototype.isPrototypeOf() 判断该对象是否为参数对象的原型

eg:console.log(Array.prototype.isPrototypeOf(b));

obj1.isPrototypeOf(obj2)
判断obj2的原型是否是obj1。

9.(4)Object.setPrototypeOf(obj)设置obj对象实例的原型

eg:10setPrototypeOf
效果如下:


2018-11-22 面向对象3_第11张图片
22.10Object.setPrototypeOf.jpg



    
    Document






9.(5)Object.getOwnPropertyNames() 成员是参数对象本身的所有属性的键名,不包含继承的属性键名。

eg:12Object.getOwnPropertyNames()
效果如下:


2018-11-22 面向对象3_第12张图片
22.12Object.getOwnPropertyNames().jpg



    
    Document






9.(6)Object.prototype.hasOwnProperty() 用于判断某个属性定义在对象自身,还是定义在原型链上。
10.函数属性的区别:
  • 私有属性 : 在对象的定义中定义的非全局变量(在对象的定义中定义的非全局变量这种方式定义的属性,类的实例不能访问;只能通过 类名.属性名访问)
  • 实例属性 : 使用this为对象附加实例属性/对象名称.属性名(这种方式定义的属性,只能通过类的实例访问.不同实例之间共享该属性;不能通过 类名.属性名的方式访问)
  • 类属性 : "类"名.属性名/类名.prototype.属性名
    eg:13私有属性与实例属性
    效果如下:
    2018-11-22 面向对象3_第13张图片
    22.13私有属性.jpg



    
    Document






11.命名空间

eg:14命名空间




    
    Document






你可能感兴趣的:(2018-11-22 面向对象3)