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
class Square{static x = 1width = 0constructor(width){this.width = width}getArea(){return this.width * this.width}}
代码规范
constructor——构造函数
- X函数本身负责给对象本身添加属性
- X.prototype对象负责保存对象的共有属性
词性:
- new后面的函数,使用名词形式:如new Person()、new Object()
- 其它函数,一般使用动词开头:如createSquare()、createElement()
