推荐几篇文章
ES6新特性总结
JS 中 proto 和 prototype 存在的意义是什么?
JS 的 new 到底是干什么的?
你可以不会 class,但是一定要学会 prototype
构造函数
定义:可以构造对象的函数。
规范:构造函数首字母大写,构造出来的函数首字母小写。
原型和公用属性的关系
共有属性的集合就是原型
X.prototype和x.proto中存的都是地址。
对象.proto === 构造函数的.prototype
Object.prototype的原型是什么?
像Object这种本身就存在的对象,没有原型,其Object.prototype.proto被设置为null
分类
有很多对象拥有一样的属性和行为,我们要把他们归为一类。
在JS中,数组是一个对象。
let arr = [1,2,3]
let arr = new Array(1,2,3) //元素为1,2,3
let arr = new Array(3) //长度为3
window是由Window构造出来的,window.proto === Window.prototype
window.Object是由window.Function构造,因为所有函数都是由window.Function构造的。
那window.Function又是谁构造的呢?
也是window.Function,其实是浏览器构造了Function,然后指定它的构造者是自己。
new X()操作帮我们做了很多事情
- 自动创建一个空对象
- 自动将该空对象的原型指向 X.prototype(即将 X.prototype 保存的地址复制到空对象.proto 里)
- 自动将空对象作为 this 来运行构造函数
- 自动 return this
class语法
class中原型的写法
class Square{
constructor(width){
this.width = width
}
getArea(){
return this.width * this.width
}
}
总结:
关于prototype属性,
- 所有函数一出生就有一个prototype属性
- 所有prototype一出生就有constructor属性
- 所有constructor一出生就保存了对应函数的地址
- 如果一个函数不是构造函数,他依然拥有prototype属性,只不过这个属性暂时没什么用
- 如果一个对象不是函数,那么这个对象一般来说没有prototype属性,但一定有proto属性。
关于Object.prototype,
- Object.prototye 是「Object 构造出来的对象 obj」的原型,即 obj.proto === Object.prototype
- Object.proto 是 Object 的原型,由于 Object 是函数,而所有函数的原型都是 Function.prototype,所以 Object.proto === Function.prototype
- Object.prototye 不是 Object 的原型,Object.proto 才是 Object 的原型(还记着之前答过「x.原型 等价于 x.proto」吗,现在只不过是把 x 替换成 Object。很多人都搞不清楚 Object.proto 和 Object.prototype 哪一个才是 Object 的原型,其实只要记住公式就好办了)
网友评论