image.png

一.构造函数

对比:

  1. function createSquare(width){
  2. let obj = Object.create(createSquare.squarePrototype)
  3. obj.with = width
  4. return obj
  5. }
  6. createSquare.squarePrototype = {
  7. getArea(){
  8. return this.width * this.width
  9. },
  10. getLength(){
  11. return this.width * 4
  12. },
  13. constructor:createSquare
  14. }
  15. let square = createSquare(s)

函数和原型结合(重写)

  1. function Square(width){
  2. this.width = width
  3. },
  4. Square.prototype.getArea = function(){
  5. return this.width * this.width
  6. },
  7. Square.prototype.getLength = function(){
  8. return this.width * 4
  9. }
  10. let square1 = new Square(5)
  11. //每个函数都有prototype属性,这是js之父故意的
  12. //每个prototype都有constructor属性,也是故意的

总结:

  • new X() 自动做了四件事:

    • 自动创建空对象
    • 自动为空对象关联原型,原型地址指定为X.prototype
    • 自动将空对象作为this关键字运行构造函数
    • 自动return this
  • 构造函数X

    • X函数本身负责给对象本身添加属性(X是上面的Square函数)
    • X.prototype对象负责保存对象的共用属性

举个例子:

  1. function Dog(name){
  2. this.name = name
  3. this.color = 'yellow'
  4. this.kind = '田园犬'
  5. }
  6. Dog.prototype.run = function(){
  7. console.log('奔得快')
  8. }
  9. Dog.prototype.jiao = function(){
  10. console.log('汪汪汪')
  11. }
  12. var dog1 = new Dog('灰虎')
  13. dog1 //如下图
  14. dog1.run()
  15. dog1.jiao()

image.png

代码规范:

  • 大小写:
    • 所有的构造函数首字母大写
    • 所有被构造出来的对象,首字母小写
  • 词性
    • new后面的函数,使用名词形式
    • 如new Person(),new Object()
    • 其他函数,一般使用动词开头
    • 如createSquare(),createElement()

      二.原型和公用属性的关系

      image.png
      整个对象叫做原型,而#309是原型的地址,或者说是这个对象的地址
      原型里面有很多属性,这些属性加一起成为共有属性
      JS变量只能存原型的地址,而不能存对象
      image.png

唯一的公式:
对象._ **proto_ ===  其构造函数.prototype
如何确定一个对象的原型
let fn = new Function()的原型就是Function.prototype
例如:
let obj = new Object() 的原型是 Object.prototype
let arr = new Array()的原型是Array.prototype
let square = new Square()的原型是 Square.prototype
因为:new操作故意这么做的
new X()自动做了四事件 :
1.自动创建空对象
2.自动为空对象关联原型,原型地址指定为X.prototype //比如:Person.prototype是地址
3.自动将空对象作为this关键字运行构造函数
4.自动return this**

window.Object.prototype === x.proto
image.png

Object.prototype是哪个函数构造出来的? ////不知道,无原型
Object.prototype. proto ===null ///!!!!!

  1. function Square(width){
  2. this.width = width
  3. }
  4. Square.prototype.getArea = function(){ //getArea是新对象原型上的共有属性
  5. return this.width * this.width
  6. }
  7. Square.prototype.getLength = function(){
  8. return this.width * 4
  9. }
  10. let square = new Square(5)
  11. square.width //自身的width属性
  12. square.getArea() //getArea和getLength是共有属性
  13. square.getLength()

三.对象需要分类

对象需要分类
理由一:
有很多对象拥有一样的属性和行为
需要把它们分为同一类
如square1和square2
这样创建类似
理由二:
但是还有很多对象拥有其他的属性和行为
所以就需要不同的分类
比如Square/Circle/Rect就是不同的分类
Array/Function也是不同的分类
而Object创建出来的对象,是最没有特点的对象

四.类型 VS 类

类型和类的区别:

类型:
类型是JS数据的分类,有七种
四基两空一对象:string,number,bool,symbol,null,undefined,object

类:
类针对于对象的分类,有很多种
常见的Array,Function,Date,RegExp

数组对象:

定义一个数组:
let arr=[1,2,3]
let arr = new Array(1,2,3) //元素为1,2,3
let arr = new Array(3) //长度为3,只有一个元素的时候

数组对象的自身属性:
‘0’/‘1’/‘2’/‘length’
注意,属性名没有数字,只有字符串

数组对象的共用属性
‘push’/‘pop’/‘shift’/‘unshift’/‘join’

函数对象:

定义一个函数:
function fn(x,y){return x+y}
let fn2 = function fn(x,y){return x+y}
let fn=(x,y)=>x+y
let fn=new Function(‘x’,’y’,’return x+y’) //x,y是形参
函数 对象自身属性:
‘name’/‘length’
函数对象共用属性:
‘call’/‘apply’/‘bind’

终极一问:

window是谁构造的
Window大写的,通过window.constructor属性看构造者
window.Object是谁构造的
window.Function
因为所有的函数都是window.Function构造的
window.Function是谁构造的
window.Function
因为所有的函数都是window.Function构造的

五.class语法

另一种用class的写法:

  1. class Square{
  2. constructor(width){
  3. this.width = width
  4. }
  5. getArea(){
  6. return this.width * this.width
  7. }
  8. }
  1. 语法1
  2. class Person{
  3. sayHi(name){}
  4. //等价于
  5. sayHi:function(name){}
  6. //注意,一般我们不在这个语法里使用箭头函数
  7. }
  8. //等价于
  9. function Person(){}
  10. Person.prototype.sayHi = function(name){}
  11. 语法2:注意冒号变成了等于号
  12. class Person{
  13. sayHi = (name)=>{}//注意,一般我们不在这个语法里使用普通函数,多用于箭头函数
  14. }
  15. //等价于
  16. function Person(){
  17. this.sayHi =(name)=>{}
  18. }

六.错题记录

image.png
image.png
image.png
image.png
image.png
image.png