构造函数和原型

99 阅读3分钟

创建对象的方法

  • 对象字面量

    var obj2={}
    
  • new Object()

    var obj1=new Object();
    
  • 自定义构造函数

    function Star(uname,age){
    this.uname=uname;//uname实例成员
    this.age=age//age实例成员
    this.sing=function(){//sing实例成员
    alert(111)
          }
    }
    var ouwen=new Star('kyrie'18)
    console.log(ouwen)
    
    kyrie.sing();
    

类就是对象的模板,对象就是类的实例

构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋值,它总与new一起使用。我们可以把对象中的一些公共的属性抽取出来,封装到函数上

构造函数注意事项:

1.构造函数用于创建某一类的对象,首字母要大写

2.构造函数要和new一起使用才有意义

new在执行时会做的四件事情

1.在内存中创建一个新的对象

2.让this指向这个对象

3.执行构造函数里面的代码给新对象添加属性和方法

4.返回这个新对象(所以构造函数里面不需要return)

构造函数中的属性和方法称为成员,成员可以添加

  • 实例成员就是构造函数内部通过this添加的成员

1.只能通过实例化的对象来访问

2.不可以通过构造函数来访问实例成员

  • 静态成员:在构造函数上添加的成员

1.静态成员只能考构造函数来访问

2.不可以通过对象来访问实例成员

构造函数问题

浪费内存

构造函数原型prototype

构造函数通过原型匹配的函数时所有对象所共享的

js中规定,每一个构造函数都有一个prototype属性,只想另一个对象那个,注意prototype就是一个对象,这个对象所有属性和方法都会被构造函数所拥有

我们可以把那些不变的方法直接定义在prototype对象上,这样所有的对象的实例就可以共享这些方法

 function Star(uname,age){
  this.uname=uname;//uname实例成员
  this.age=age//age实例成员
 }
 //一般公共的属性定义到构造函数里面
 //公共的方法放在原型对象那个身上
 Star.prototyoe.sing=function(){
 alert(111)
 }
  var ouwen=new Star('kyrie'18)
  console.log(ouwen)

  kyrie.sing();
  //对象身上系统自己添加一个_proto_指向构造函数的原型对象
  //方法的查找规则:首先查看kyrie身上是否有sing方法有就执行
  //有_proto_的存在就去构造函数原型对象身上查找
  • 原型是一个对象prototype就是原型对象
  • 共享方法

对象_proto_

对象的属性_proto_指向构造函数的原型对象

  1. _proto_对象原型和原型对象是等价的

  2. _proto_对象原型的以以就在于为对象的查找机制提供一个方向,后遭说一条线

  3. 方法的查找规则:首先查看kyrie身上是否有sing方法有就执行有_proto_的存在就去构造函数原型对象身上查找

constructor构造函数

_proto_对象原型和原型prototype里面都有一个属性constructor,constructor称为构造函数,它指向构造函数本身

如果修改了原来的原型对象,给原型对象赋值的时一个对象,必须手动 的利用constructor指回原来的函数

原型链

屏幕截图 2022-07-25 174629.png 只要是对象就有_proto_对象原型,指向原型对象

js的成员查找机制(规则)

11.png

原型对象this指向

1.构造函数中this指向对象实例

2.原型对象中的this指向的是实例对象

原型对象的应用 扩展内置对象方法

可以通过原型对象,对原来的的内置对象进行扩展自定义的方法,比如给数组添加自定义求偶数和的功能

Array.prototype.sum = function() {
    var sum = 0;
    for (var i = 0; i < this.length; i++) {
        sum += this[i];
    }
    return sum;
}
var arr = [1, 2, 3];
console.log(arr.sum());
 console.log(Array.prototype);

数组和字符串内置对象不能给原型对象覆盖操作 Array.prototype={}只能是 Array.prototype.xxx = function() 的方式