new操作符

new操作符做了什么事情

  • 创建一个空对象,并且this变量引用该对象,继承该函数的原型
  • 属性和方法被加入到this引用的对象中
  • 新创建的对象有this所引用,最后隐式返回this

    一个对象的原型

    每个对象都会在内部初始化一个属性,就是prototype,当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么就回去prototype中找这个属性,这个prototype又会有自己的原型,就一直这样找下去
    例如:
    let obj = new Object()的原型是Object.prototype
    let arr = new Array()的原型是Array.prototype
    let squre = new Squre()的原型是Squre.prototype
    let fn = new Function()的原型是Function.prototype

你是谁构造的,你的原型就是谁的prototype属性对应的对象即:
对象.proto===其构造函数.prototype

  • 每个对象都有原型

原型里存着对象的共有属性
比如 obj 的原型就是一个对象
obj.proto 存着这个对象的地址
这个对象里有 toString / constructor / valueOf 等属性

  • 对象的原型也是对象

所以对象的原型也有原型
obj = {} 的原型即为所有对象的原型
这个原型包含所有对象的共有属性,是对象的根
这个原型也有原型,是 null

window是谁构造的

  • Window
  • 可以通过constructor属性看出构造者
    • window.Object是谁构造的
  • window.Function
  • 因为所有函数都是window.Function构造的
    • window.Function是谁构造的
  • window.Function
  • 因为所有函数都是window.Function构造的
  • 浏览器构造了Function,然后指定它的构造者是自己

this指向问题

  • 全局环境中this指向全局变量window
  • 函数中的this,由调用函数的方式来决定
  • 构造函数里的this以及原型里的this对象指的都是生成的实例(由new决定的)
  • 箭头函数按词法作用域来绑定它的上下文,所以this 实际上会引用到原来的上下文

    ES6引入新语法:class

    1. class Square{
    2. static x = 1
    3. width = 0
    4. constructor(width){
    5. this.width = width
    6. }
    7. getArea(){
    8. return this.width * this.width
    9. }
    10. }

    代码规范

    constructor——构造函数
  1. X函数本身负责给对象本身添加属性
  2. X.prototype对象负责保存对象的共有属性

词性:

  1. new后面的函数,使用名词形式:如new Person()、new Object()
  2. 其它函数,一般使用动词开头:如createSquare()、createElement()